JSON_ENCODE für mehrdimensionales Array, das unterschiedliche Ergebnisse liefert
Lesezeit: 3 Minuten
Dangel
Wenn ich json_encode für ein mehrdimensionales Array in PHP verwende, bemerke ich eine Ausgabe, wenn ich eines der Arrays benenne, aber eine andere Ausgabe, wenn ich sie nicht benenne. Zum Beispiel:
Warum sollte die erste Option nicht die gleichen Ergebnisse wie die zweite zurückgeben, außer mit „1“ anstelle von „secondarray“?
Felix Kling, warum hast du mein JSON-Encode-Tag entfernt? Ich sage nicht, dass Sie das nicht hätten tun sollen, sondern ich möchte vielmehr sicherstellen, dass ich das korrekte Tagging-Verfahren befolge. Da json-encode in meinem Code enthalten ist, gehe ich davon aus, dass es als richtiges Tag gelten würde.
– baumeln
28. Mai 2012 um 14:45 Uhr
In JSON Arrays [] nur alle haben Zifferntasten, während Objekte {} haben String-Eigenschaften. Die Einbeziehung eines Array-Schlüssels in Ihr zweites Beispiel zwingt die gesamte äußere Struktur zwangsläufig dazu, ein Objekt zu sein. Die inneren Objekte beider Beispiele werden aufgrund der Einbeziehung von Zeichenfolgenschlüsseln als Objekte erstellt a,b,c,d.
Wenn Sie das verwenden würden JSON_FORCE_OBJECT Option im ersten Beispiel verwenden, sollten Sie eine ähnliche Struktur wie im zweiten zurückerhalten, wobei die äußere Struktur ein Objekt und kein Array ist. Ohne anzugeben, dass Sie es als Objekt möchten, geht PHP aufgrund des Fehlens von Zeichenfolgenschlüsseln im äußeren Array davon aus, dass es als entsprechende Array-Struktur in JSON codiert werden soll.
$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}}
Warum sollte man es dann JAVASCRIPT OBJECT NOTATION nennen, wenn es nichts mit Javascript zu tun hätte?
– Brendan Lesniak
28. Mai 2012 um 14:40 Uhr
Macht jetzt Sinn, danke für die Erklärung, ich denke, das wird mich in die richtige Richtung führen.
– baumeln
28. Mai 2012 um 2:42
@Brendan Warum hat das nichts mit Javascript zu tun?
– deceze ♦
28. Mai 2012 um 2:43
@deceze Ein früherer Kommentar, der den Kontext dazu lieferte, wurde entfernt.
– Michael Berkowski
28. Mai 2012 um 2:47
Ja, jetzt sieht es blöd aus, dass ich das dort hatte. Als Referenz sagte jemand, JSON habe nichts mit Javascript zu tun.
– Brendan Lesniak
28. Mai 2012 um 2:52
Felix Kling
Arrays mit fortlaufenden numerischen Schlüsseln werden als JSON-Arrays codiert. Ist einfach so. Warum? Weil es Sinn macht.
Da die Schlüssel implizit durch die Array-Kodierung ausgedrückt werden können, gibt es keinen Grund, sie explizit als Objektschlüssel zu kodieren.
Ich sage nicht, dass das nicht sein sollte, deshalb habe ich die Frage gestellt.
– baumeln
28. Mai 2012 um 2:37
Bei der ersten Option haben Sie nur numerische Indizes (0, 1 und 2). Obwohl sie nicht explizit deklariert sind, werden sie von PHP automatisch erstellt.
Bei der zweiten Option deklarieren Sie einen der Indizes als String, wodurch PHP alle Indizes intern in Strings umwandelt.
Wenn Sie das erste Array mit JSON kodieren, ist es nicht notwendig, die Ganzzahlen in der generierten JSON-Zeichenfolge anzuzeigen, da jeder Decoder in der Lage sein sollte, zu „erraten“, dass es sich um 0, 1 und 2 handelt.
Im zweiten Array ist dies jedoch erforderlich, da der Decoder den Schlüsselwert in Ihrem Array kennen muss.
Es ist ziemlich einfach. Keine Indizes im Array deklariert? Sie sind 0, 1, 2, 3 und so weiter.
Nabeel Ali
Die Ausgabe davon im JSON-Format ist Jahr1{a,b},Jahr2{c}, Jahr3{d} **a hat den Wert 1,b=2,c=3,d=4, gespeichert im Array von a,b von Jahr1 c der Jahre 2 und d der Jahre 3
Felix Kling, warum hast du mein JSON-Encode-Tag entfernt? Ich sage nicht, dass Sie das nicht hätten tun sollen, sondern ich möchte vielmehr sicherstellen, dass ich das korrekte Tagging-Verfahren befolge. Da json-encode in meinem Code enthalten ist, gehe ich davon aus, dass es als richtiges Tag gelten würde.
– baumeln
28. Mai 2012 um 14:45 Uhr