peligro
Cuando uso json_encode para una matriz multidimensional en PHP, noto un resultado al nombrar una de las matrices, pero un resultado diferente cuando no los nombro. Por ejemplo:
$arrytest = array(array('a'=>1, 'b'=>2),array('c'=>3),array('d'=>4));
json_encode($arrytest)
da una matriz única de múltiples objetos json
[{"a":1,"b":2},{"c":3},{"d":4}];
mientras que simplemente asignando un nombre a la matriz central
$arrytest = array(array('a'=>1, 'b'=>2),"secondarray"=>array('c'=>3),array('d'=>4));
json_encode($arrytest)
crea un solo objeto json con múltiples objetos json dentro
{"0":{"a":1,"b":2},"secondarray":{"c":3},"1":{"d":4}};
¿Por qué la primera opción no devolvería los mismos resultados que la segunda excepto con “1” en lugar de “secundario”?
En JSON, matrices []
solo todos 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 hacen como objetos debido a la inclusión de claves de cadena a,b,c,d
.
Si fueras a usar el JSON_FORCE_OBJECT
opción en el primer ejemplo, debería obtener una estructura similar a la del segundo, con la estructura externa como un objeto en lugar de una matriz. Sin especificar que lo quiere como un objeto, la ausencia de claves de cadena en la matriz externa hace que PHP asuma que debe codificarse 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}}
-
Entonces, ¿por qué llamarlo NOTACIÓN DE OBJETOS DE JAVASCRIPT, si no tiene nada que ver con Javascript?
–Brendan Lesniak
28 de mayo de 2012 a las 2:40
-
Tiene sentido ahora, gracias por esa explicación, creo que me llevará en la dirección correcta.
– peligro
28 de mayo de 2012 a las 2:42
-
@Brendan ¿Por qué no tiene nada que ver con Javascript?
– deceze
♦28 de mayo de 2012 a las 2:43
-
@deceze Se eliminó un comentario anterior que brindaba contexto para esto.
–Michael Berkowski
28 de mayo de 2012 a las 2:47
-
Sí, ahora parece estúpido que tuviera eso allí. Como referencia, alguien dijo que JSON no tenía nada que ver con Javascript.
–Brendan Lesniak
28 de mayo de 2012 a las 2:52
Félix Kling
Las matrices con claves 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 a través de la codificación de matriz, no hay razón para codificarlas explícitamente como claves de objeto.
Ver todos los ejemplos en el json_encode
documentación.
-
No digo que no deban serlo, por eso estaba haciendo la pregunta.
– peligro
28 de mayo de 2012 a las 2:37
En la primera opción solo tienes índices numéricos (0, 1 y 2). Aunque no se declaran explícitamente, 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 una cadena.
Cuando codifica json la primera matriz, no es necesario mostrar los números enteros en la cadena json generada porque cualquier decodificador debería poder “adivinar” que son 0, 1 y 2.
Pero en la segunda matriz, esto es necesario, ya que el decodificador debe conocer el valor clave en su matriz.
Es bastante simple. ¿No hay índices declarados en la matriz? Ellos son 0, 1, 2, 3 y así sucesivamente.
Nabeel Alí
la salida de esto como en formato json es year1{a,b},year2{c}, year3{d} **a tiene valor 1,b=2,c=3,d=4 almacenado en la matriz de year1’s a,b años2’s c y años3’s d respectivamente
$array1 = array('a'=>1, 'b'=>2);
$array2 = array('c'=>3);
$array3 = array('d'=>4)
$form = array("year1" =>$array1,
"year2" =>$array2,
"year3" =>$array3,
);
$data = json_encode($form);
Felix Kling, ¿por qué eliminaste mi etiqueta json-encode? No digo que no debas hacerlo, sino que quiero asegurarme de que estoy siguiendo el procedimiento correcto para el etiquetado, dado que json-encode está en mi código, pensé que se aplicaría como una etiqueta adecuada.
– peligro
28 de mayo de 2012 a las 2:45