У нас есть массив, ключи которого являются строками, но эти строки иногда просто числа (например, «123»). При попытке доступа к массиву по ключу «123» мы получаем уведомление о неопределенном индексе. При доступе к нему с помощью целого числа 123 мы получаем уведомление о неопределенном смещении. Это говорит нам о том, что мы пытаемся правильно проиндексировать его, используя строку «123», но он все еще не установлен.
Пытаться найти пример для этого вопроса SO, это сложно, поскольку PHP преобразует ключи массива в нашем тесте case в целые числа автоматически, в то время как в нашем реальном приложении этого не происходит (из-за использования Java Bridge). Тестовый массив, который мы сейчас пробуем, выглядит следующим образом:
<?php
$array = array("123" => array(108, 8));
var_dump($array);
?>
Это возвращает:
array(1) { [123]=> array(2) { [0]=> int(108) [1]=> int(8) } }
В нашем реальном эквиваленте он вернет:
array(1) { ["123"]=> array(2) { [0]=> int(108) [1]=> int(8) } }
Итак, в реальном мире индекс фактически является строкой:
<?php
var_dump(array_keys($array));
?>
возвращает
array(1) { [0]=> string(3) "123" }
Итак, наконец, вопрос заключается в выводе следующего кода:
<?php
foreach ($array as $key => $value) {
if (!isset($array[$key])) {
print "What is happening here?";
}
}
?>
который дает:
What is happening here?
Основываясь на комментарии Йоши, вот рабочий тестовый код:
<?php
$array = (array)json_decode('{"123":[108,8]}');
foreach ($array as $key => $value) {
if (!isset($array[$key])) {
print "What is happening here?";
} else {
print "Nothing to see here, move along";
}
}
?>