2012-05-28 17 views
17

Quando si effettua una json_encode un array multidimensionale in PHP, sto notando un output diverso semplicemente nominando una delle matrici, al contrario, non loro di denominazione. Per esempio:json_encode di array multidimensionale dare risultati diversi

$arrytest = array(array('a'=>1, 'b'=>2),array('c'=>3),array('d'=>4)); 
json_encode($arrytest) 

dà un singolo array di json più oggetti

[{"a":1,"b":2},{"c":3},{"d":4}]; 

che semplicemente assegnando un nome all'array mezzo

$arrytest = array(array('a'=>1, 'b'=>2),"secondarray"=>array('c'=>3),array('d'=>4)); 
json_encode($arrytest) 

crea un singolo oggetto JSON con più oggetti JSON all'interno di

{"0":{"a":1,"b":2},"secondarray":{"c":3},"1":{"d":4}}; 

Perché il 1 ° opzione non restituire gli stessi reasults come il 2 ° execpt con "1" al posto di "secondArray"

+0

http://json.org/ –

+3

Felix Kling, perché hai rimosso il mio tag json-encode? Non sto dicendo che non dovresti avere, ma piuttosto voglio assicurarmi che segua la procedura corretta per il tagging, dato che json-encode è nel mio codice, anche se si applicherebbe come tag corretto. – dangel

risposta

25

in JSON, array [] solo ogni hanno i tasti numerici, mentre gli oggetti {} hanno proprietà di stringa . L'inclusione di una chiave di array nel secondo esempio costringe l'intera struttura esterna a essere un oggetto per necessità. Gli oggetti interni di entrambi gli esempi vengono creati come oggetti a causa dell'inclusione delle chiavi stringa a,b,c,d.

Se si dovesse utilizzare l'opzione JSON_FORCE_OBJECT nel primo esempio, si dovrebbe ripristinare una struttura simile alla seconda, con la struttura esterna un oggetto anziché una matrice. Senza specificare che lo si desidera come oggetto, l'assenza di chiavi stringa nell'array esterno fa sì che PHP assuma che sia codificato come struttura di array equivalente in JSON.

$arrytest = array(array('a'=>1, 'b'=>2),array('c'=>3),array('d'=>4)); 

// Force the outer structure into an object rather than array 
echo json_encode($arrytest , JSON_FORCE_OBJECT); 

// {"0":{"a":1,"b":2},"1":{"c":3},"2":{"d":4}} 
+4

Allora perché chiamarlo JAVASCRIPT OBJECT NOTATION, se non aveva nulla a che fare con Javascript. – Brendan

+0

Ora ha senso, grazie per questa spiegazione penso che mi farà andare nella giusta direzione. – dangel

+1

@Brendan Perché non ha nulla a che fare con Javascript? – deceze

0

Gli array con tasti numerici continui sono codificati come array JSON. È proprio così. Perché? Perché ha un senso.

Poiché i tasti possono essere espresse implicitamente attraverso la codifica matrice, non v'è alcun motivo per loro codificati esplicitamente come chiavi oggetto.

Vedi tutti gli esempi del json_encode documentation.

+0

Non sto dicendo che non dovrebbero essere, è per questo che stavo facendo la domanda. – dangel

0

Alla prima opzione sono disponibili solo indici numerici (0, 1 e 2). Sebbene non siano esplicitamente dichiarati, php li crea automaticamente.

Alla seconda opzione, si dichiara uno degli indici come una stringa e questo rende PHP trasformare internamente tutti gli indici a stringa.

quando si codifica JSON il primo array, non è necessario mostrare i numeri interi nella stringa JSON generato perché qualsiasi decoder dovrebbe essere in grado di "indovinare" che sono 0, 1 e 2.

Ma nel secondo array, questo è necessario, poiché il decodificatore deve conoscere il valore chiave nell'array.

È piuttosto semplice. Nessun indice dichiarato nell'array? Sono 0, 1, 2, 3 e così via.