PHP-Array zu JSON-Array mit json_encode ();

77

Ich habe ein Array codiert, das ich mit der eingebauten json_encode();Funktion erstellt habe. Ich brauche es im Format eines Arrays von Arrays wie folgt:

[["Afghanistan",32,12],["Albania",32,12]]

Es kehrt jedoch zurück als:

["2":["Afghanistan",32,12],"4":["Albania",32,12]]

Wie kann ich diese Zeilennummern entfernen, ohne Regex-Tricks anzuwenden?

Ryan Brodie
quelle
Können Sie uns mehr Code zeigen, damit wir eine Vorstellung davon haben, was Sie sonst noch tun?
Jim
5
["2":["Afghanistan",32,12],"4":["Albania",32,12]]ist nicht einmal gültig JSON, also bezweifle ich, dass Sie das bekommen. Wenn Ihr Array der obersten Ebene assoziativ ist, rufen Sie einfach array_values()auf, um aufeinanderfolgende indizierte Elemente abzurufen.
Felix Kling
Auch für dieses Thema von Interesse: php.net/manual/en/function.json-encode.php#105923
Ben

Antworten:

167

Wenn die Array-Schlüssel in Ihrem PHP-Array keine fortlaufenden Zahlen sind, json_encode() muss das andere Konstrukt ein Objekt sein, da JavaScript-Arrays immer fortlaufend numerisch indiziert werden.

Verwenden Sie array_values()die äußere Struktur in PHP, um die ursprünglichen Array-Schlüssel zu verwerfen und durch eine auf Null basierende fortlaufende Nummerierung zu ersetzen:

Beispiel:

// Non-consecutive 3number keys are OK for PHP
// but not for a JavaScript array
$array = array(
  2 => array("Afghanistan", 32, 13),
  4 => array("Albania", 32, 12)
);

// array_values() removes the original keys and replaces
// with plain consecutive numbers
$out = array_values($array);
json_encode($out);
// [["Afghanistan", 32, 13], ["Albania", 32, 12]]
Michael Berkowski
quelle
1
Ich habe hier geendet, als ich herausfand, dass json_encode ein Array ohne ersichtlichen Grund in ein Objekt konvertiert hat, wenn das Array nur ein Element enthält, nachdem es von array_filter gefiltert wurde. Ich weiß nicht, ob der Array-Index etwas mit diesem ekelhaften PHP- "Bug" zu tun hat, aber array_values ​​hat es für mich aussortiert. Von nun an gibt es keinen json_encode eines Arrays mehr, ohne dass array_values ​​aufgerufen wird.
Mar Bar
@MarBar Wenn das Array einen nicht numerischen Zeichenfolgenschlüssel oder einen numerischen Schlüssel außerhalb der Reihenfolge hat , json_encode()wird {}eher ein Objekt als ein Array erzeugt, []da JavaScript / JSON keine andere Möglichkeit hat, eine solche Struktur darzustellen. Aber ja, Sie können die Schlüssel entfernen, array_keys()wenn sie in der resultierenden JSON-Zeichenfolge nicht benötigt werden.
Michael Berkowski
@MichaelBerkowski: Ich bekomme das gleiche Problem mit einem zusammengesetzten Primärschlüssel aus einer DB-Tabelle, wo ich zuerst tun muss: mysqli_fetch_assocund dann array_values... Ich frage mich, ob dies der performanteste Weg ist, um echte Arrays mit viel zu erhalten von Daten ... sollte ich meine Gewohnheit umschreiben json_encode? Was ist Ihre (geschätzte) Meinung dazu?
Deblocker
1
@deblocker Schwer zu erratende Stunde Composite Key passt. Im Allgemeinen array_*()sind alle Funktionen von PHP sehr effizient. In einem kleinen Array bevorzuge ich im Allgemeinen die Verwendung einiger Array_ * -Funktionen mit einer Aktion, wenn ich Schleifen vermeiden kann. Wenn Ihr mysqli_result jedoch groß ist, möchten Sie möglicherweise nicht alles auf einmal in ein Array kompilieren und dann aufrufen array_values(). Stattdessen ist es möglicherweise besser, beim Abrufen Zeilen an ein Array anzuhängen. Alle Spekulationen, weil ich nicht weiß, wie Ihr Code aussieht.
Michael Berkowski
1
@Gem Das hängt sehr stark von der Struktur des XML ab, das Sie erstellen müssen, da XML-Elemente irgendwie benannt werden müssen. Es gibt Beispiele in stackoverflow.com/questions/1397036/…
Michael Berkowski
18

Mit der Funktion json_encode () können Sie das Array in PHP in JSON codieren .

Wenn Sie nur die Funktion json_encode direkt ohne eine bestimmte Option verwenden, wird ein Array zurückgegeben. Wie oben erwähnt

$array = array(
  2 => array("Afghanistan",32,13),
  4 => array("Albania",32,12)
);
$out = array_values($array);
json_encode($out);
// [["Afghanistan",32,13],["Albania",32,12]]

Da Sie versuchen, Array in JSON zu konvertieren, würde ich vorschlagen, JSON_FORCE_OBJECT als zusätzliche Option (Parameter) in json_encode zu verwenden , wie unten

<?php
$array=['apple','orange','banana','strawberry'];
echo json_encode($array, JSON_FORCE_OBJECT);
// {"0":"apple","1":"orange","2":"banana","3":"strawberry"} 
?>
Dinesh Gopal Chand
quelle
1
Vielen Dank, das JSON_FORCE_OBJECT war eine große Hilfe
Uriahs Victor
6

Ich möchte Michael Berkowskis Antwort hinzufügen, dass dies auch passieren kann, wenn die Reihenfolge des Arrays umgekehrt wird. In diesem Fall ist es etwas schwieriger, das Problem zu beobachten, da die Reihenfolge im json-Objekt aufsteigend angeordnet wird.

Zum Beispiel:

[
    3 => 'a',
    2 => 'b',
    1 => 'c',
    0 => 'd'
]

Wird zurückkehren:

{
    0: 'd',
    1: 'c',
    2: 'b',
    3: 'a'
}

In diesem Fall besteht die Lösung darin, sie array_reversevor dem Codieren in json zu verwenden

Inc33
quelle
Ich denke, die array_valuesvon @Michael Berkowski geschriebene Lösung ist universeller und funktioniert auch in Ihrem Fall.
Jacopo Pace
0

Wenn Sie in Ihrem ursprünglichen Array keine Indizes angeben, erhalten Sie die regulären numerischen Indizes. Arrays müssen einen eindeutigen Index haben

Strahl
quelle
0

Eine häufige Verwendung von JSON besteht darin, Daten von einem Webserver zu lesen und die Daten auf einer Webseite anzuzeigen.

In diesem Kapitel erfahren Sie, wie Sie JSON-Daten zwischen dem Client und einem PHP-Server austauschen.

PHP verfügt über einige integrierte Funktionen für JSON.

Objekte in PHP können mithilfe der PHP-Funktion json_encode () in JSON konvertiert werden:

<?php
$myObj->name = "John";
$myObj->age = 30;
$myObj->city = "New York";

$myJSON = json_encode($myObj);

echo $myJSON;
?>

L VEERAPANDI BCA
quelle
0

Ich hatte ein Problem mit Zeichen mit Akzent beim Konvertieren eines PHP-Arrays in JSON. Ich habe überall UTF-8-Zeug platziert, aber nichts hat mein Problem gelöst, bis ich diesen Code in meine PHP-while-Schleife eingefügt habe, in der ich das Array gepusht habe:

$es_words[] = array(utf8_encode("$word"),"$alpha","$audio");

Es war nur die Variable '$ word', die ein Problem verursachte. Danach hat es einen jason_encode kein Problem gemacht.

hoffentlich hilft das

mstone
quelle