Domanda

ho un array semplice:

array
  0 => string 'Kum' (length=3)
  1 => string 'Kumpel' (length=6)

quando ho codificare l'array usando json_encode (), ottengo seguente:

["Kum","Kumpel"] 

La mia domanda è, qual è il motivo per ottenere ["Kum","Kumpel"] invece di { "0" : "Kum", "1" : "Kumpel" }?

È stato utile?

Soluzione

"{}" parentesi specificano un oggetto e "[]" sono utilizzati per gli array in base alle specifiche JSON. Gli array non hanno l'enumerazione, se la si guarda dal punto di vista di allocazione della memoria. E 'solo i dati seguiti da altri dati, oggetti provenienti da altra parte hanno proprietà con i nomi ei dati vengono assegnati alle proprietà, quindi, per codificare tale oggetto è necessario passare anche i nomi di proprietà corretti. Ma per allineamento non è necessario specificare gli indici, perché hanno sempre saranno 0..n, dove n è la lunghezza della matrice - 1, l'unica cosa che conta è l'ordine dei dati.

$array = array("a","b","c");
json_encode($array); // ["a","b","c"]
json_encode($array, JSON_FORCE_OBJECT); // {"0":"a", "1":"b","2":"c"}

Il motivo per cui JSON_FORCE_OBJECT Foces in modo da utilizzare "0,1,2" è perché per assegnare i dati a obeject è necessario assegnare a una proprietà, in quanto non nomi di proprietà sono date da sviluppatore (solo i dati) il codificatore utilizza matrice indici come nomi di proprietà, perché quelli sono gli unici nomi che avrebbe senso.

Nota: in base al manuale di PHP le opzioni sono disponibili solo i parametri da PHP 5.3

Per le versioni di PHP vecchie riferimento alla risposta di chelmertz di un modo per rendere json_encode a utilizzare gli indici.

Altri suggerimenti

Come ha detto Gumbo, sul JS-side non importa. Per forzare PHP in esso, provate questo:

$a = new stdClass();
$a->{0} = "Kum";
$a->{1} = "Kumpel";
echo json_encode($a);

Non che utilizzabile, mi piacerebbe restare con la notazione di matrice.

Proprio lanciata come un oggetto e che funzionerà bene ... il parametro JSON_FORCE_OBJECT fa esattamente la stessa cosa.

json_encode((object)$array);

Non dimenticate di riconvertirlo in un array PHP in modo da poter accedere ai relativi valori in php:

$array = (object)$array;
$array = (array)$array;

json_encode($array);

Dal momento che stai attraversando un array PHP con i tasti numerici solo, non v'è alcuna necessità di utilizzare un oggetto JavaScript. Ma se avete bisogno di uno, provare il suggerimento di Maiku Mori.

Io personalmente penso che questo sia un bug che deve essere risolto in PHP. JSON_FORCE_OBJECT non è assolutamente una risposta. Se si tenta di fare qualsiasi tipo di programmazione generica si ottiene inciampato costantemente. Ad esempio, il seguente è valida PHP:

array ( "0" => array (0,1,2,3), "1" => array (4,5,6,7));

E dovrebbe essere convertito in

{ "0": [0,1,2,3], "1": [4,5,6,7]}

Ancora PHP si aspetta che io accettare

[[0,1,2,3], [4,5,6,7]]

o

{ "0": { "0": 1, "1": 1, "2": 2, "3": 3}, "1": { "0": 4, "1": 5 , "2": 6, "3": 7}}

Nessuno dei quali sono proprio a tutti. Come posso decodificare un oggetto del genere? Quale possibile ragione è lì per cambiare mai qualcosa che è chiaramente usando stringhe come indici? E 'come PHP stava cercando di essere intelligente per aiutare le persone idiote che non possono differenziarsi stringhe da interi, ma nel processo incasinato chiunque legittimamente usando stringhe come indici, indipendentemente da quale sia il valore potrebbe essere trasformata in.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top