json_encode spärliches PHP-Array als JSON-Array, nicht als JSON-Objekt

119

Ich habe das folgende Array in PHP:

Array
(
    [0] => Array
        (
            [id] => 0
            [name] => name1
            [short_name] => n1
        )

    [2] => Array
        (
            [id] => 2
            [name] => name2
            [short_name] => n2
        )
)

Ich möchte JSON als JSON-Array codieren und eine Zeichenfolge wie die folgende erzeugen:

[  
    {  
        "id":0,
        "name":"name1",
        "short_name":"n1"
    },
    {  
        "id":2,
        "name":"name2",
        "short_name":"n2"
    }
]

Wenn ich json_encodedieses Array aufrufe, erhalte ich Folgendes:

{  
    "0":{  
        "id":0,
        "name":"name1",
        "short_name":"n1"
    },
    "2":{  
        "id":2,
        "name":"name2",
        "short_name":"n2"
    }
}

Das ist ein Objekt anstelle eines Arrays.

Wie kann ich json_encodestattdessen mein Array als Array codieren?

Martijn Pieters
quelle

Antworten:

194

Sie beobachten dieses Verhalten, weil Ihr Array nicht sequentiell ist - es hat Schlüssel 0und 2, aber keinen 1Schlüssel.

Nur numerische Indizes zu haben, reicht nicht aus. json_encodecodiert Ihr PHP-Array nur dann als JSON-Array, wenn Ihr PHP-Array sequentiell ist - dh wenn seine Schlüssel 0, 1, 2, 3, ... sind.

Sie können Ihr Array nacheinander neu indizieren, indem Sie die array_valuesFunktion verwenden, um das gewünschte Verhalten zu erzielen . Der folgende Code funktioniert beispielsweise in Ihrem Anwendungsfall erfolgreich:

echo json_encode(array_values($input)).
Nguyen Van Vinh
quelle
4
aber was ist, wenn Schlüssel 0,2wichtig sind? Ich bin in der gleichen Situation, in der ich das Array nicht neu indizieren kann.
Shyammakwana.me
2
JSON unterstützt kein assoziatives Array. Siehe
Nguyen Van Vinh
74

Arrayin JSONist indiziertes Array nur , so dass die Struktur ist ungültig Json / Javascript zu bekommen versuchen.

Das Array PHP Associatives sind Objekte in JSON. Wenn Sie den Index nicht benötigen, können Sie solche Konvertierungen nicht durchführen.

Wenn Sie eine solche Struktur erhalten möchten, können Sie Folgendes tun:

$indexedOnly = array();

foreach ($associative as $row) {
    $indexedOnly[] = array_values($row);
}

json_encode($indexedOnly);

Will gibt so etwas zurück wie:

[
     [0, "name1", "n1"],
     [1, "name2", "n2"],
]
Boris Guéry
quelle
1
Vielen Dank, dass Sie mir den Hinweis auf ein indiziertes Array gegeben haben :) Das Problem war, dass ich es so indiziert habe, dass die ID auch die ID des Arrays anstelle einer sequentiellen ID war und json_encode sie nicht als Array, sondern wie in aufgenommen hat Objekt stattdessen, weil das Array nicht sequentiell war, ist es jetzt behoben, danke für all Ihre Hilfe Jungs :)
Nicht wahr. Einige Bibliotheken codieren assoziative Arrays als Arrays mit dem Index als einer der Elementeigenschaften.
Gustavo
Ich verstehe nicht, was Sie meinen - das Array in Martins Antwort ist nicht indiziert, und das ist gültiger JSON.
Und schließlich
@AndFinally, das Array in Martins Antwort ist eigentlich indiziert, implizit. Das Weglassen des Index führt zu einem indizierten Array ab Null.
Boris Guéry
Diese Antwort lieferte nicht ganz das, was das OP zum Zeitpunkt der Veröffentlichung der Frage wollte (nicht überraschend, da das, was das OP wollte, unmöglich war), und ihre Änderungen daran haben diese Antwort angesichts des aktuellen Standes der Frage scheinbar völlig falsch erscheinen lassen Frage. Sie können diese Antwort nicht löschen, da sie akzeptiert wird, aber möglicherweise einen Moderator markieren, um sie für Sie zu löschen? Da es über 5 Upvotes hat, behalten Sie Ihren Repräsentanten.
Mark Amery
0

json_decode ($ jsondata, true);

true wandelt alle Eigenschaften in ein Array um (sequentiell oder nicht)

Robert Sinclair
quelle
bezieht sich nicht auf die von OP gestellte Frage. OP speziell gefragt Codierungsproblem mitjson_encode
pg2286
Wie hängt das nicht zusammen? Dies zeigt ein Beispiel für die Verwendung von json_encode, damit die Daten in ein lesbares Array umgewandelt werden. Die Frage von OP lautet: "Wie kann ich json_encode dazu bringen, mein Array als Array zu codieren?" Mein Code-Bit macht genau das. Mit "codieren" meint er "verwandelt sich in". Das ist kein Grund zur Ablehnung.
Robert Sinclair
Oh, ich verstehe jetzt Ihren Standpunkt, dass Sie so etwas $serialized = json_encode($nonContiguousArray); $unserialize = json_decode($serialized, true); endlich empfehlen würden, finallySerializedInArrayFormat = json_encode($unserialize);wenn Sie beabsichtigen, dass Sie Recht haben, aber es schien eine etwas umständliche Lösung zu sein.
pg2286
-1

Versuche dies,

<?php
$arr1=array('result1'=>'abcd','result2'=>'efg'); 
$arr2=array('result1'=>'hijk','result2'=>'lmn'); 
$arr3=array($arr1,$arr2); 
print (json_encode($arr3)); 
?>
Y0Gi
quelle
Dies löst nicht das Problem, was das OP zu fragen versucht.
pg2286