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