У меня есть JSON, похожий на следующее:
{"internalArray": {"201": "A", "202": "B", "5": "C", "46": "D"}, "data": "ABCDEFG", "data2": "TSXPIIF"}
Я использую следующий код PHP для его декодирования:
$jsonOutput = json_decode($output);
Я хотел бы получить доступ к «internalArray» из данных JSON, поэтому я ссылаюсь на него, используя следующее:
$internalArray = $jsonOutput->{'internalArray'};
Когда я делаю var_dump на $ internalArray
object(stdClass)#4 (4) { ["201"]=> string(1) "A" ["202"]=> string(1) "B" ["5"]=> string(1) "C" ["46"]=> string(1) "D" }
Я понял, что могу применить это к массиву, поэтому я сделал следующее:
$internalArray = (array) $jsonOutput->{'internalArray'};
Однако теперь, когда у меня есть этот массив, я не могу получить доступ к нему, используя такие значения, как
$internalArray["202"], $internalArray["201"], etc.
Когда я пытаюсь получить к нему доступ через ключи, он возвращает NULL. Однако, когда у меня есть такой код:
foreach ($internalArray as $key => $value) { echo $key . "," . $value; }
он печатает значения, как ожидалось, например «202, A» и т. д.
Однако в том же коде, если я изменю его на
foreach ($internalArray as $key => $value) { echo $key . "," . $internalArray[$key]; }
это не работает!
Может ли кто-нибудь объяснить, почему я не могу получить доступ к значениям в $ internalArray, используя ключи? Я что-то принципиально неправильно здесь?
Если вам нужен ассоциативный массив, вы можете задать PHP для ассоциативного массива (см. Документацию по json_decode
):
$jsonOutput = json_decode($output, true); var_dump($jsonOutput['internalArray']);
Производит:
array(4) { [201]=> string(1) "A" [202]=> string(1) "B" [5]=> string(1) "C" [46]=> string(1) "D" }
Вернемся к вашей проблеме, ваш код будет работать, если ключи во внутреннем массиве не были числовыми. То, что здесь происходит, немного странно: PHP не позволяет вам иметь числовые строки (например: '201'
, '46'
) в качестве ключей для массива.
Вместо этого клавиши с числовыми строками преобразуются в числовые ключи. Поэтому, когда вы делаете $arr['201']
PHP будет искать $arr[201]
. Однако, когда вы бросаете свой объект в массив, похоже, что ключи массива остаются строками (например: $arr['201']
). Теперь фактический массив имеет числовой строковый ключ, но всякий раз, когда вы пытаетесь получить к нему доступ, PHP ищет ключ int и никогда не находит его, давая вам NULL
.
Фактически, в документации отмечается, что:
Если объект преобразуется в массив, результатом является массив, элементами которого являются свойства объекта. Ключи – это имена переменных-членов, с несколькими заметными исключениями: целочисленные свойства недоступны ; (…)
Поскольку данные не являются массивом, это объект. Следовательно, вы не можете использовать его в этом фрагменте кода
foreach ($internalArray as $key => $value) { echo $key . "," . $internalArray[$key]; }
и использовать для ассоциированного массива json_decode($output, true);