2010-03-20 14 views
22

puedo crear una matriz dispersa php (o mapa) usando el comando:Decode escasa JSON objeto de matriz PHP

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

quiero serializar/deserializar esto como JSON. Puedo serializar utilizando el comando:

$json = json_encode($myarray); 

que se traduce en la cadena {"10":"hi","test20":"howdy"}. Sin embargo, cuando Deserialize esto y echarlo a una matriz mediante el comando:

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

Me parece perder ninguna de las asignaciones con llaves que no eran válidos identificadores php. Es decir, mynewarray tiene el mapeo 'test20'=>'howdy', pero no 10=>'hi' ni '10'=>'hi'.

¿Hay alguna forma de conservar las teclas numéricas en un mapa php al convertir ay desde json con las funciones estándar json_encode/json_decode?

(estoy usando PHP Versión 5.2.10-2ubuntu6.4.)

Respuesta

47

json_decode devuelve un objeto de tipo stdClass por defecto. Accede a miembros como propiedades (es decir, $result->test20). 10 no es un nombre válido para una propiedad, y es por eso que lo está perdiendo.

En lugar de moldear a un array, puede pasar true como segundo argumento a json_decode para hacerla volver en sí una matriz asociativa:

$mynewarray = json_decode($json, true);

Si lo hace, $mynewarray[10] no tendrán ningún problema.

+0

Gracias Chris, esto es exactamente lo que necesitaba. –

+0

'true' es importante, para hacer en PHP Array type, sino' stdClass Object' – Rafee

+0

omg, gracias a Dios, me acabo de volar el cerebro. Dejé array, vi la clave, pero no pude acceder a val por ella. – GoldenTabby

2

¿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" 
} 

que no muestra el comportamiento que usted describe.

Dicho esto, si su versión de PHP está miscasting el JSON, trate de usar get_object_vars en el objeto stdClass que json_decode vuelve

get_object_vars(json_decode($json)) 

que podrían volverá mejores resultados.

+0

tiene un índice de "10" al que no se puede acceder mediante el operador '[]' en PHP – vava

+0

Ah, lo tengo, serializa la clave como una cadena que resulta ser un número, que no se puede obtener. La solución get_object_vars debería resolver eso, así como el segundo parámetro de json_decode, mencionado anteriormente. –

2

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" 
} 

Vea cómo esta matriz tiene índice "10"? Pero en PHP, todo lo que se parece a 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. Mientras que usted no será capaz de hacer o $a->10$a->"10",

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

//outputs 
string(2) "hi" 

obras.

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

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

//outputs 
string(2) "hi"