Frage

ich habe ein einfaches Array:

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

, wenn ich das Array mit json_encode () kodieren, erhalte ich folgendes:

["Kum","Kumpel"] 

Meine Frage ist, was ist der Grund ["Kum","Kumpel"] statt { "0" : "Kum", "1" : "Kumpel" } zu bekommen?

War es hilfreich?

Lösung

„{}“ Klammern ein Objekt angeben, und „[]“ werden für Arrays gemäß JSON Beschreibung verwendet. Arrays haben keine Aufzählung, wenn man es aus Speicherzuweisung Perspektive zu betrachten. Es ist nur durch weitere Daten folgen Daten, Objekte aus anderen Hand haben Eigenschaften mit Namen und die Daten zu den Eigenschaften zugeordnet ist, also auf solche Objekt kodieren Sie auch die richtige Eigenschaftsnamen passieren muss. Aber für Array Sie nicht die Indizes angeben müssen, weil sie immer sein wird 0..n, wobei n die Länge des Arrays - 1, das einzige, was zählt die Reihenfolge der Daten ist.

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

Der Grund, warum JSON_FORCE_OBJECT Foces es „0,1,2“ zu verwenden ist, weil zu assign Daten obeject Sie es auf eine Eigenschaft zuweisen müssen, da keine Eigenschaftsnamen von Entwicklern gegeben werden (nur die Daten) der Encoder verwendet Array Indizes als Eigenschaftsnamen, weil diejenigen, die nur Namen sind, die Sinn machen würde.

Hinweis: nach PHP-Handbuch sind die Optionen Parameter nur von PHP 5.3 verfügbar

Für ältere PHP-Versionen beziehen sich auf chelmertz Antwort für eine Art und Weise zu machen json_encode zu verwenden Indizes.

Andere Tipps

Wie Gumbo sagte auf der JS-Seite wird es keine Rolle. Um zu erzwingen, PHP hinein, versuchen Sie dies:

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

Nicht, dass verwendbar, ich mit der Array-Notation halten würde.

Just werfen als ein Objekt, und es wird gut funktionieren ... die JSON_FORCE_OBJECT Parameter tut genau das gleiche.

json_encode((object)$array);

Vergessen Sie nicht, es zu konvertieren zurück in eine PHP-Array, so dass Sie ihre Werte in PHP zugreifen können:

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

json_encode($array);

Da Sie mit nur numerischen Tasten einen PHP-Array haben sollte, gibt es keine Notwendigkeit, ein JavaScript-Objekt zu verwenden. Aber wenn man einen braucht, versuchen Maiku Mori Vorschlag.

Ich persönlich denke, das ist ein Fehler, dass der Bedarf in PHP festgelegt werden. JSON_FORCE_OBJECT ist absolut keine Antwort. Wenn Sie versuchen, jede Art von generischer Programmierung tun Sie ständig stolpern lassen. Zum Beispiel ist die folgende gültige PHP:

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

Und konvertiert werden soll

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

Doch PHP erwartet, dass ich entweder akzeptieren

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

oder

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

Keiner von denen sind in Ordnung. Wie kann ich vielleicht ein Objekt wie das dekodieren? Was möglicher Grund ist, es zu immer etwas ändern, die eindeutig Strings als Indizes verwendet wird? Es ist wie PHP versucht aus idiotischen Menschen zu helfen, klug zu sein, die nicht differenzierbare Strings aus Ints können, aber in dem Prozess jemand berechtigterweise Strings als Indizes verkorksten verwenden, unabhängig davon, was könnte der Wert in umgewandelt werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top