对于不存在的数组键,isset()返回true的奇怪行为

时间:2012-02-03 17:21:08

标签: php arrays isset

我有以下名为$fruits的数组:

Array
(
    [response] => Array
        (
            [errormessage] => banana
        )  

    [blah] => Array
        (
            [blah1] => blahblah1
            [blah2] => blahblah2
            [blah3] => blahblah3
            [blah4] => blahblah4
        )  

)

然而,当我这样做时:

isset($fruits['response']['errormessage']['orange'])

返回 true

究竟是什么导致这种奇怪的行为?我该如何解决这个问题?

谢谢!

3 个答案:

答案 0 :(得分:11)

它归结为PHP的疯狂类型系统。

$fruits['response']['errormessage']是字符串'banana',因此您尝试通过['orange']索引访问该字符串中的字符。

为了编制索引,字符串'orange'将转换为整数,因此它变为0,如$fruits['response']['errormessage'][0]中所示。字符串的第0个索引是字符串的第一个字符,因此对于非空字符串,它基本上是设置的。因此isset()返回true。

我不知道你最初想要做什么,所以我不能为此提供任何“修复”。这是设计的。

答案 1 :(得分:6)

[n]也是一种访问字符串中字符的方法:

$fruits['response']['errormessage']['orange']
==
$fruits['response']['errormessage'][0] // cast to int
==
b (the first character, at position 0) of 'banana'

使用array_key_exists,可能与is_array结合使用。

答案 2 :(得分:0)

修复

if (is_array($fruits['response']['errormessage']) 
    && isset($fruits['response']['errormessage']['orange'])) { .. }
相关问题