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.