декодирование массива из json в PHP и невозможность доступа к элементам массива с использованием ключей

У меня есть 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);