Странное поведение с isset (), возвращающим true для ключа массива, который НЕ существует - PullRequest
2 голосов
/ 03 февраля 2012

У меня есть следующий массив с именем $fruits:

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

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

)

Все же, когда я делаю:

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

Возвращает true !

Что может вызвать такое странное поведение и как я могу это исправить?

Спасибо!

Ответы [ 3 ]

11 голосов
/ 03 февраля 2012

Это сводится к сумасшедшей системе типов PHP.

$fruits['response']['errormessage'] - это строка 'banana', поэтому вы пытаетесь получить доступ к символу в этой строке по индексу ['orange'].

Строка 'orange' преобразуется в целое число для целей индексации, поэтому она становится 0, как в $fruits['response']['errormessage'][0]. 0-й индекс строки является первым символом строки, поэтому для непустых строк он по существу установлен. Таким образом isset() возвращает истину.

Я не знаю, что вы пытаетесь сделать в первую очередь, поэтому я не могу предложить никакого "исправления" для этого. Это по замыслу.

6 голосов
/ 03 февраля 2012

[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.

0 голосов
/ 03 февраля 2012

исправить

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