2010-03-20 5 views
22

posso creare una matrice sparsa php (o mappa) con il comando:Decode oggetto JSON sparse per php gamma

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

voglio serializzare/deserializzare questo come JSON. Posso serializzare usando il comando:

$json = json_encode($myarray); 

che si traduce nella stringa {"10":"hi","test20":"howdy"}. Tuttavia, quando ho deserializzare questo e gettalo via a una matrice con il comando:

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

mi sembra di perdere tutti i mapping con le chiavi che non erano identificatori php validi. Cioè, mynewarray ha mappatura 'test20'=>'howdy', ma non 10=>'hi''10'=>'hi'.

C'è un modo per preservare i tasti numerici in una mappa php quando si effettua la conversione da e verso di nuovo da json utilizzando le funzioni standard json_encode/json_decode?

(sto usando PHP versione 5.2.10-2ubuntu6.4.)

risposta

47

json_decode restituisce un oggetto di tipo stdClass per impostazione predefinita. Si accede ai membri come proprietà (ad esempio, $result->test20). 10 non è un nome valido per una proprietà, motivo per cui lo stai perdendo.

Invece di lanciare ad un array, è possibile passare true come secondo argomento per json_decode per renderlo restituire un array associativo stesso:

$mynewarray = json_decode($json, true);

Se lo fai, $mynewarray[10] funzionerà bene.

+0

Grazie Chris, questo è esattamente ciò di cui avevo bisogno. –

+0

'true' è importante, per fare in tipo array di PHP, altrimenti' stdClass Object' – Rafee

+0

omg, grazie amico, mi ha solo fatto esplodere il cervello. Ho scaricato array, ho visto la chiave, ma non ho potuto accedere a val da essa. – GoldenTabby

2

Quale versione di PHP? Sul 5.2 il seguente programma/script

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

uscite

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

che non presenti il ​​comportamento che stai descrivendo.

Detto questo, se la versione di PHP è miscasting il JSON, provare a utilizzare get_object_vars sull'oggetto stdClass che json_decode rendimenti

get_object_vars(json_decode($json)) 

che potrebbero restituire risultati migliori.

+0

ha un indice "10" a cui non è possibile accedere tramite l'operatore '[]' in PHP – vava

+0

Ah, preso, serializza la chiave come una stringa che sembra essere un numero, a cui non si può accedere. La soluzione get_object_vars dovrebbe risolvere ciò, così come il secondo parametro di json_decode, menzionato sopra. –

2

Il problema è nella conversione da oggetto a matrice.

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

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

Vedere come questo array ha indice "10"? Ma in PHP, tutto ciò che assomiglia a un numero viene convertito in un numero, specialmente negli indici di array. Non si può semplicemente ottenere a["10"] perché converte "10" in un numero e questo array non ha un tale indice.

Tuttavia, foreach funziona.

foreach ($a as $key => $value) { 
    var_dump($key); 
    var_dump($value); 
} 

//outputs 
string(2) "10" 
string(2) "hi" 
string(6) "test20" 
string(5) "howdy" 

È anche possibile trattare il risultato di json_decode come oggetto. Anche se non sarà in grado di fare $a->10 o $a->"10",

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

//outputs 
string(2) "hi" 

opere.

Ma molto probabilmente, come ha detto Chris, si vuole solo passare true come secondo argomento.

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

//outputs 
string(2) "hi"