2012-09-24 17 views
5

se faccio questo:risultati diversi per json_encode() PHP

$new_arr = array(
0 => 'keyboard', 
1 => 'mouse', 
2 => 'computer' 
); 

print_r(json_encode($new_arr)); 

uscita:

[ "tastiera", "mouse", "computer"]

Ma diciamo che prendo tutte le righe della tabella "prodotto" dal mio database e faccio questo:

$product_with_id_map = array(); 
foreach($query as $result) { 
$product_with_id_map[$result->id] = $result->name; 
} 
print_r(json_encode($product_with_id_map)); 

uscita:

{ "0": "Tastiera", "1": "mouse", "2": "computer"}

ho davvero bisogno di conservare la chiave del array quando json_encode puoi anche dirmi come ottenere il secondo output nel primo esempio?

+1

Proprio così ho la tua domanda giusta: la seconda forma di output è quella desiderata, giusto? – vzwick

+0

sì esattamente voglio conservare le chiavi dell'array nel mio json_encode –

+2

* "Ho davvero bisogno di conservare la chiave dell'array quando ho json_encode ..." * Bene, tecnicamente tu hai. I tasti sono gli stessi in entrambi gli esempi. Ma il primo è un array, l'altro è solo un oggetto con chiavi di proprietà costituite interamente da cifre. Se il linguaggio che decodifica questo JSON è JavaScript, è una differenza molto sottile (poiché le chiavi dell'array sono stringhe in JavaScript - [sì, davvero] (http://blog.niftysnippets.org/2011/01/myth-of-arrays. html)). Altre lingue possono variare. –

risposta

6

Lancia la matrice all'oggetto.

$new_arr = array(
    0 => 'keyboard', 
    1 => 'mouse', 
    2 => 'computer' 
); 

print_r(json_encode((object)$new_arr)); 
// output: {"0":"keyboard","1":"mouse","2":"computer"} 

addtion: Se si utilizza questo risultato in javascript, ti suggerisco di usare l'array, array è anche oggetto in javascript, inoltre, fornire più metodi e proprietà length a voi.

+0

sì perfetto che funziona, puoi dirmi perché ho ottenuto risultati diversi? –

+0

@ user1537158 - perché gli array funzionano in modo diverso rispetto agli oggetti in JSON. – vzwick

+0

@xdazz: non è nemmeno necessario convertire la matrice in oggetto. L'output di json_encode può contenere chiavi, dal momento che sta usando una sequenza numerica incrementale per costruire array, l'output json_encode sta omettendo le chiavi. Questo non ha alcun effetto quando converte la stringa json_encoded in array indietro, le chiavi torneranno in sequenza incrementale.Prova a cambiare la chiave da '1' a' 4' e vedi l'uscita json_encode –

8

Utilizzare le opzioni (since PHP 5.3):

print_r(json_encode($product_with_id_map, JSON_FORCE_OBJECT)); 
2

questo sta accadendo perché gli indici che vengono restituiti dalla banca dati stanno tornando come stringhe e così vengono codificati in JSON troppo. Dove come quando stai creando l'array tu stesso li imposti come numeri interi e quindi vengono ignorati.

Si potrebbe o provare

$new_arr = array(
'0' => 'keyboard', 
'1' => 'mouse', 
'2' => 'computer' 
); 

print_r(json_encode($new_arr)); 

o si potrebbe trun l'array in un oggetto che permetta di preservare gli indici.

print_r(json_encode((object)$new_arr)); 
+0

Il tuo primo pezzo di codice non funzionerà, non fa alcuna differenza a meno che tu non lanci l'array a oggetto. – xdazz

Problemi correlati