JSON_ENCODE de multidimensional array dando resultados diferentes

Ao fazer um json_encode uma multidimensional array em PHP, estou percebendo uma saída diferente simplesmente nomeando uma das matrizes, ao contrário de não as nomear. Por exemplo:

$arrytest = array(array('a'=>1, 'b'=>2),array('c'=>3),array('d'=>4)); json_encode($arrytest) 

oferece uma única matriz de múltiplos objects json

 [{"a":1,"b":2},{"c":3},{"d":4}]; 

enquanto simplesmente atribuindo um nome à matriz do meio

 $arrytest = array(array('a'=>1, 'b'=>2),"secondarray"=>array('c'=>3),array('d'=>4)); json_encode($arrytest) 

cria um único object json com vários objects json dentro

 {"0":{"a":1,"b":2},"secondarray":{"c":3},"1":{"d":4}}; 

Por que a 1ª opção não retornaria os mesmos resultados que o 2º execpt com “1” no lugar de “secondarray”

Em JSON, arrays [] apenas todos têm chaves numéricas, enquanto objects {} possuem propriedades de string. A inclusão de uma chave de matriz em seu segundo exemplo obriga toda a estrutura externa a ser um object por necessidade. Os objects internos de ambos os exemplos são feitos como objects por causa da inclusão de teclas de string a,b,c,d .

Se você usasse a opção JSON_FORCE_OBJECT no primeiro exemplo, você deve recuperar uma estrutura semelhante à segunda, com a estrutura externa um object em vez de uma matriz. Sem especificar que você o quer como um object, a ausência de chaves de string na matriz externa faz com que o PHP assuma que ele deve ser codificado como a estrutura de matriz equivalente no JSON.

 $arrytest = array(array('a'=>1, 'b'=>2),array('c'=>3),array('d'=>4)); // Force the outer structure into an object rather than array echo json_encode($arrytest , JSON_FORCE_OBJECT); // {"0":{"a":1,"b":2},"1":{"c":3},"2":{"d":4}} 

Na primeira opção, você só possui índices numéricos (0, 1 e 2). Embora não sejam explicitamente declarados, o PHP os cria automaticamente.

Na segunda opção, você declara um dos índices como uma string e isso faz com que o PHP inteiramente transforme todos os índices para seqüência de caracteres.

Quando você json codifica a primeira matriz, não é necessário mostrar os números inteiros na string json gerada porque qualquer decodificador deve “adivinhar” que são 0, 1 e 2.

Mas na segunda matriz, isso é necessário, pois o decodificador deve conhecer o valor da chave na sua matriz.

É muito simples. Nenhum índice declarado em matriz? Eles são 0, 1, 2, 3 e assim por diante.

Arrays com chaves numéricas contínuas são codificados como arrays JSON. É assim que é. Por quê? Porque faz sentido.

Uma vez que as teclas podem ser expressas de forma implícita através da codificação da matriz, não há motivo para codificá-las explicitamente como chaves de object.

Veja todos os exemplos na documentação json_encode .