La encoding PHP JSON convierte la clave en cadena cuando se desarma

¿Pueden ayudarme a explicar lo que está sucediendo aquí?

$data[0] = array("one" => "uno", "two" => "dos", "three" => "tres"); $data[1] = array("one" => "uno", "two" => "dos", "three" => "tres"); //unset($data[0]); $encode = json_encode($data); $decode = json_decode($encode); var_dump($decode); 

productos:

 array(2) { [0]=> object(stdClass)#1 (3) { ["one"]=> string(3) "uno" ["two"]=> string(3) "dos" ["three"]=> string(4) "tres" } [1]=> object(stdClass)#2 (3) { ["one"]=> string(3) "uno" ["two"]=> string(3) "dos" ["three"]=> string(4) "tres" } } 

Esto es normal, lo mantiene como una matriz, pero tan pronto como desarmo una parte de la matriz, la convierte en un obj.

 $data[0] = array("one" => "uno", "two" => "dos", "three" => "tres"); $data[1] = array("one" => "uno", "two" => "dos", "three" => "tres"); unset($data[0]); $encode = json_encode($data); $decode = json_decode($encode); var_dump($decode); 

salida:

 object(stdClass)#1 (1) { ["1"]=> object(stdClass)#2 (3) { ["one"]=> string(3) "uno" ["two"]=> string(3) "dos" ["three"]=> string(4) "tres" } } 

¿Cómo guardo la consistencia?

Me gustaría ver json_encode en las opciones. Creo que JSON_FORCE_OBJECT debe forzar la constancia.

Como explicó Marc B en un comentario, necesita volver a indexar la matriz a índices basados ​​en cero. En PHP, eso se puede hacer con array_values :

 $encode = json_encode(array_values($data)); 

Ver también:

  • Ayuda a editar JSON para hacer una matriz en lugar de un ‘diccionario’ (jun 2011)

Javascript distingue entre matrices y objetos. PHP solo tiene matrices para cubrir ambos tipos a la vez.

Continuamente numéricamente las matrices PHP de 0 inicios están codificadas para las matrices de Javascript, cualquier otra cosa está codificada para los objetos.