为什么在数组中没有这样的索引时会返回一个字符串值?

时间:2012-11-08 14:28:38

标签: php string

  

可能重复:
  Strange behavior with isset() returning true for an Array Key that does NOT exist

$arr = array(
         'application' => array (
            'environment' => 'development',
            'mode_debug' => 1,
            'key' => '123456abcdefg',
            'debug_soft' =>
            'firephp',
            'aaa' => array (
                'bbb' => '111',
                'ccc' => '222',
                'ddd' => array (
                    'eee' => '12345',
                ),
            ),
        ),
        'database' => array (
            'host' => 'localhost',
            'database' => '',
            'username' => '',
            'password' => '',
            'charset' => 'utf8',
            'prefix' => '',
        ),
    );


if(isset($arr["application"]["aaa"]["ddd"]["eee"]['out']) && !empty($arr["application"]["aaa"]["ddd"]["eee"]['out'])){
    echo "a";
    echo '<br />';
    var_dump($arr["application"]["aaa"]["ddd"]["eee"]['out']);
}else{
    echo "b";
}

返回:

a
string(1) "1" 

但'$ arr'数组中没有'out'索引,为什么它返回'string(1)“1”'?

手册没有帮助,因为它只采样一个维度阵列:

$a = array ('test' => 1, 'hello' => NULL);

var_dump( isset ($a['test']) );            // TRUE
var_dump( isset ($a['foo']) );             // FALSE
var_dump( isset ($a['hello']) );           // FALSE

3 个答案:

答案 0 :(得分:7)

考虑一下:

$str = 'test';
var_dump(isset($str['xxx'])); // true

它返回true,因为:

  • PHP支持$str[$n]语法(用于处理字符串的各个字符)

  • 计算索引时,它会转换为整数类型

  • 当转换为整数时,"xxx"0;您正在访问$str[0] - 该$str字符串的第一个字符,而它(t)是一个真值。

请注意isset的这种(非常奇怪的)行为已在PHP 5.4中修复:

  

5.4.0 :检查字符串的非数字偏移现在返回FALSE。

答案 1 :(得分:2)

这样做是因为您的eee索引包含值的字符串 - 并且字符串可以作为数组进行访问。当您在字符串中使用索引out时,它会将out转换为整数值0,为您提供$arr["application"]["aaa"]["ddd"]["eee"][0],等于1

您可以使用is_array()

来防止这种情况发生
if (is_array($arr["application"]["aaa"]["ddd"]["eee"]) && isset($arr["application"]["aaa"]["ddd"]["eee"]['out'])) {

答案 2 :(得分:1)

似乎返回$ arr [“application”]的第一个字符'1'[“aaa”] [“ddd”] [“eee”]值“12345”甚至键'out'不存在。< / p>