2012-05-28 22 views
17

Al hacer un json_encode una matriz multidimensional en PHP, estoy notando una salida diferente simplemente nombrando una de las matrices, en lugar de no nombrarlas. Por ejemplo:JSON_ENCODE de matriz multidimensional dando resultados diferentes

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

da una única matriz de JSON múltiples objetos

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

mientras que simplemente asignando un nombre a la matriz media

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

crea un único objeto JSON con objetos json múltiples dentro de

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

¿por qué la primera opción no devolver los mismos reasults como el segundo execpt con "1" en lugar de "secondArray"

+0

http://json.org/ –

+3

Felix Kling, ¿por qué eliminaste mi etiqueta json-encode? No estoy diciendo que no debas, pero más bien quiero asegurarme de seguir el procedimiento correcto para etiquetar, dado que json-encode está en mi código, aunque se aplicaría como una etiqueta adecuada. – dangel

Respuesta

25

En JSON, matrices [] sólo cada tienen teclas numéricas, mientras que los objetos {} tienen propiedades de cadena . La inclusión de una clave de matriz en su segundo ejemplo obliga a que toda la estructura externa sea un objeto por necesidad. Los objetos internos de ambos ejemplos se crean como objetos debido a la inclusión de las claves de cadena a,b,c,d.

Si utilizó la opción JSON_FORCE_OBJECT en el primer ejemplo, debe obtener una estructura similar a la segunda, con la estructura externa como un objeto en lugar de una matriz. Sin especificar que lo desee como objeto, la ausencia de claves de cadena en la matriz externa provoca que PHP suponga que se codificará como la estructura de matriz equivalente en 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}} 
+4

Entonces, ¿por qué llamarlo JAVASCRIPT OBJECT NOTATION si no tiene nada que ver con Javascript? – Brendan

+0

Tiene sentido ahora, gracias por esa explicación, creo que me llevará en la dirección correcta. – dangel

+1

@Brendan ¿Por qué no tiene nada que ver con Javascript? – deceze

0

Las matrices con teclas numéricas continuas se codifican como matrices JSON. Así es como es. ¿Por qué? Porque tiene sentido.

Dado que las claves se pueden expresar implícitamente mediante la codificación de matriz, no hay ninguna razón para codificarlas explícitamente como claves de objeto.

Ver todos los ejemplos en el json_encode documentation.

+0

No estoy diciendo que no deberían ser, es por eso que estaba haciendo la pregunta. – dangel

0

En la primera opción, solo tiene índices numéricos (0, 1 y 2). Aunque no están explícitamente declarados, php los crea automáticamente.

En la segunda opción, declara uno de los índices como una cadena y esto hace que PHP transforme internamente todos los índices en cadena.

Al codificar JSON la primera matriz, no es necesario mostrar los números enteros en la cadena JSON generado, ya que cualquier decodificador debe ser capaz de "adivinar" que son 0, 1 y 2.

Pero en el segundo conjunto, esto es necesario, ya que el decodificador debe conocer el valor clave en su conjunto.

Es bastante simple. No hay índices declarados en el conjunto? Ellos son 0, 1, 2, 3 y así sucesivamente.

Cuestiones relacionadas