decodificando uma matriz de json em PHP e não conseguiu acessar elementos de matriz usando chaves

Eu tenho algum JSON semelhante ao seguinte:

{"internalArray": {"201": "A", "202": "B", "5": "C", "46": "D"}, "data": "ABCDEFG", "data2": "TSXPIIF"} 

Eu uso o seguinte código PHP para decodificá-lo:

 $jsonOutput = json_decode($output); 

Gostaria de ter access ao “internalArray” a partir dos dados JSON, então faço referência ao uso do seguinte:

 $internalArray = $jsonOutput->{'internalArray'}; 

Quando eu faço um var_dump em $ internalArray

 object(stdClass)#4 (4) { ["201"]=> string(1) "A" ["202"]=> string(1) "B" ["5"]=> string(1) "C" ["46"]=> string(1) "D" } 

Eu descobri que eu poderia lançar isso para uma matriz, então eu fiz o seguinte:

 $internalArray = (array) $jsonOutput->{'internalArray'}; 

No entanto, agora que eu tenho essa matriz, não consigo acessar acessá-lo usando valores como

 $internalArray["202"], $internalArray["201"], etc. 

Quando tento acessá-lo através das teclas, ele retorna NULL. No entanto, quando eu tenho um código como este:

 foreach ($internalArray as $key => $value) { echo $key . "," . $value; } 

ele imprime os valores como esperado, como “202, A”, etc.

No entanto, no mesmo código se eu mudar para

 foreach ($internalArray as $key => $value) { echo $key . "," . $internalArray[$key]; } 

não funciona!

Alguém pode explicar por que não posso acessar os valores em $ internalArray usando as chaves? Estou fazendo algo fundamentalmente errado aqui?

Se você deseja uma matriz associativa, você pode pedir ao PHP uma matriz associativa (consulte a documentação do json_decode ):

 $jsonOutput = json_decode($output, true); var_dump($jsonOutput['internalArray']); 

Produz:

 array(4) { [201]=> string(1) "A" [202]=> string(1) "B" [5]=> string(1) "C" [46]=> string(1) "D" } 

De volta ao seu problema, seu código ainda funcionaria se as chaves na matriz interna não fossem numéricas. O que está acontecendo aqui é um pouco peculiar: o PHP não permite que você tenha cordas numéricas (por exemplo: '201' , '46' ) como chaves para uma matriz.

As chaves de cadeias numéricas serão convertidas em chaves de números em vez disso. Então, quando você faz $arr['201'] PHP procurará $arr[201] vez disso. No entanto, quando você coloca seu object em uma matriz, parece que as chaves da matriz permanecem as seqüências de caracteres (por exemplo: $arr['201'] ). Agora, a matriz atual possui uma chave de seqüência numérica, mas sempre que você tenta acessá-la, o PHP procura uma chave int e nunca acha, dando-lhe NULL .

De fato, a documentação observa que:

Se um object é convertido em uma matriz, o resultado é uma matriz cujos elementos são as propriedades do object. As chaves são os nomes das variables ​​do membro, com algumas excepções notáveis: as propriedades inteiras são inacessíveis ; (…)

Como os dados não são matriz, é um object. Portanto, você não pode usá-lo por este trecho de código

 foreach ($internalArray as $key => $value) { echo $key . "," . $internalArray[$key]; } 

e use para associar matriz json_decode($output, true);