Странное поведение с isset (), возвращающее true для Array Key, который НЕ существует

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

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

Но когда я это делаю:

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

Он возвращает true !

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

Благодаря!

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

Это просто сводится к безумной системе PHP.

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

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

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

исправить

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