JSON_ENCODE für mehrdimensionales Array, das unterschiedliche Ergebnisse liefert

Lesezeit: 3 Minuten

Dangels Benutzeravatar
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:

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

Gibt ein einzelnes Array mehrerer JSON-Objekte an

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

wohingegen dem mittleren Array einfach ein Name zugewiesen wird

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

Erstellt ein einzelnes JSON-Objekt mit mehreren darin enthaltenen JSON-Objekten

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

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

Benutzer-Avatar von Felix Kling
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.

Sehen Sie sich alle Beispiele im an json_encode Dokumentation.

  • 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.

Benutzeravatar von Nabeel Ali
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

$array1 = array('a'=>1, 'b'=>2);
    $array2 = array('c'=>3);
    $array3 = array('d'=>4)
    $form = array("year1" =>$array1,
                  "year2" =>$array2,
                  "year3" =>$array3,
            );

    $data = json_encode($form);

1453230cookie-checkJSON_ENCODE für mehrdimensionales Array, das unterschiedliche Ergebnisse liefert

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy