recorrer leer json_encode ejemplo array php map json sparse-array

leer - recorrer json php



Decodificar objeto json disperso a php array (3)

¿Qué versión de PHP? En 5.2 el siguiente programa / script

$myarray = array(10=>''hi'',''test20''=>''howdy''); $json = json_encode($myarray); $mynewarray = (array) json_decode($json); var_dump($mynewarray);

Salidas

array(2) { ["10"]=> string(2) "hi" ["test20"]=> string(5) "howdy" }

Lo que no muestra el comportamiento que estás describiendo.

Dicho esto, si su versión de PHP está malversando el JSON, intente usar get_object_vars en el objeto stdClass que devuelve json_decode

get_object_vars(json_decode($json))

Eso podría dar mejores resultados.

Puedo crear una matriz php dispersa (o mapa) usando el comando:

$myarray = array(10=>''hi'',''test20''=>''howdy'');

Quiero serializar / deserializar esto como JSON. Puedo serializarlo usando el comando:

$json = json_encode($myarray);

que da como resultado la cadena {"10":"hi","test20":"howdy"} . Sin embargo, cuando deserializo esto y lo convierto en una matriz con el comando:

$mynewarray = (array)json_decode($json);

Parece que pierdo cualquier asignación con claves que no eran identificadores php válidos. Es decir, mynewarray tiene el mapeo ''test20''=>''howdy'' , pero no 10=>''hi'' ni ''10''=>''hi'' .

¿Hay alguna manera de conservar las claves numéricas en un mapa php al convertir y regresar desde json usando las json_encode estándar json_encode / json_decode ?

(Estoy usando PHP versión 5.2.10-2ubuntu6.4.)


El problema está en la conversión de objeto a matriz.

$a = (array)json_decode(''{"10":"hi","test20":"howdy"}''); var_dump($a); //outputs array(2) { ["10"]=> string(2) "hi" ["test20"]=> string(5) "howdy" }

¿Ves cómo esta matriz tiene índice "10" ? Pero en PHP, todo lo que parece un número se convierte en un número, especialmente en índices de matriz. No puede simplemente obtener a["10"] porque convierte "10" en un número y esta matriz no tiene dicho índice.

Sin embargo, foreach funciona.

foreach ($a as $key => $value) { var_dump($key); var_dump($value); } //outputs string(2) "10" string(2) "hi" string(6) "test20" string(5) "howdy"

También puede tratar el resultado de json_decode como un objeto. Si bien no podrá hacer $a->10 o $a->"10" ,

$a = json_decode(''{"10":"hi","test20":"howdy"}''); $b = 10; var_dump($a->$b); //outputs string(2) "hi"

trabajos.

Pero lo más probable es que, como dijo Chris, solo quieras pasar la true como un segundo argumento.

$a = json_decode(''{"10":"hi","test20":"howdy"}'', true); var_dump($a[10]); //outputs string(2) "hi"


json_decode devuelve un objeto de tipo stdClass de forma predeterminada. $result->test20 miembros como propiedades (es decir, $result->test20 ). 10 no es un nombre válido para una propiedad, por lo que la estás perdiendo.

En lugar de convertir a una matriz, puede pasar true como segundo argumento a json_decode para que devuelva una matriz asociativa:

$mynewarray = json_decode($json, true);

Si haces eso, $mynewarray[10] funcionará bien.