Aber da ich die Namen nicht kenne (z 'John', 'Jennifer') und alle verfügbaren Schlüssel und Werte (wie 'age', 'count') vorher denke ich, dass ich eine Foreach-Schleife erstellen muss.
Ich würde mich über ein Beispiel dafür freuen.
Sie sind auf dem richtigen Weg. Schlagen Sie die Syntax für foreach nach (Sie sollten Schlüssel und Werte erhalten). Noch nicht aufgeben!
– Stefan Mai
3. Dezember 2010 um 8:12 Uhr
@ Stefan Mai: foreach($variable as $key => $val) sollte das sein was du willst 🙂
– Bojangles
3. Dezember 2010 um 8:15 Uhr
@JamWaffles Haha, danke. Ich hatte gehofft, dass OP etwas Erfahrung beim Nachschlagen sammeln könnte. Upvotes, weil es wirklich alles ist, was er/sie braucht.
– Stefan Mai
3. Dezember 2010 um 8:16 Uhr
Nebenbemerkung: Ich schlage vor, Sie konfigurieren Ihr PHP-Setup so, dass alle Arten von Fehlermeldungen angezeigt werden, einschließlich notices
– Alvaro González
3. Dezember 2010 um 8:39 Uhr
Können Sie erläutern, was Sie aus dem “Parsen” des JSON herausholen möchten: dh welche Aufgabe versuchen Sie mit Ihrem Code zu erfüllen (wie: “Alle Status ausgeben”, “Namen finden, bei denen der Status xyz ist”, “find alle Informationen für xyz”)?
– Salat
3. Dezember 2010 um 10:43 Uhr
Gordon
Um über ein mehrdimensionales Array zu iterieren, können Sie verwenden RecursiveArrayIterator
$jsonIterator = new RecursiveIteratorIterator(
new RecursiveArrayIterator(json_decode($json, TRUE)),
RecursiveIteratorIterator::SELF_FIRST);
foreach ($jsonIterator as $key => $val) {
if(is_array($val)) {
echo "$key:\n";
} else {
echo "$key => $val\n";
}
}
Ausgabe:
John:
status => Wait
Jennifer:
status => Active
James:
status => Active
age => 56
count => 10
progress => 0.0029857
bad => 0
Bietet dieser Ansatz einen besonderen Vorteil gegenüber dem guten alten foreach?
– Alvaro González
3. Dezember 2010 um 8:32 Uhr
@Álvaro offensichtlich. Mit foreach können Sie nur eine Tiefenebene rekursieren. Mit dem obigen Ansatz können Sie über ein mehrstufiges Array rekursieren. Außerdem ist das Ganze in OOP gekapselt, sodass Sie es besser wiederverwenden können und es in UnitTests leicht nachahmen können. Außerdem können Sie Iteratoren mit anderen Iteratoren stapeln, die verschiedene Dinge tun, wie z benutzerdefinierte Iteratoren, die Sie möglicherweise erstellen möchten.
– Gordon
3. Dezember 2010 um 8:39 Uhr
Okay, ich hatte nicht bedacht, dass die Verschachtelungsebene variabel ist. In einem solchen Fall ist dies sauberer als eine rekursive Funktion.
– Alvaro González
3. Dezember 2010 um 9:04 Uhr
Diese Stilanalyse hinterlässt jedoch einige Mehrdeutigkeiten. Zum Beispiel {'John':{'status':'waiting', 'Mary':{'status','nested'}}, 'Suzy':{'status:'waiting'} } ist nicht zu unterscheiden von {'John':{'status':'waiting'}, 'Mary':{'status','nested'}, 'Suzy':{'status:'waiting'} }. Dass Mary ist ein strukturelles Kind von John ist verloren.
Ich kann nicht glauben, dass so viele Leute Antworten posten, ohne den JSON richtig zu lesen.
Wenn Sie foreach iterieren $json_a allein haben Sie ein Objekt von Objekten. Auch wenn Sie vorbeikommen true Als zweiten Parameter haben Sie ein zweidimensionales Array. Wenn Sie die erste Dimension durchlaufen, können Sie die zweite Dimension nicht einfach so wiederholen. Das ist also falsch:
Um den Status jeder Person wiederzugeben, versuchen Sie Folgendes:
<?php
$string = file_get_contents("/home/michael/test.json");
if ($string === false) {
// deal with error...
}
$json_a = json_decode($string, true);
if ($json_a === null) {
// deal with error...
}
foreach ($json_a as $person_name => $person_a) {
echo $person_a['status'];
}
?>
Wenn sich die PHP- und JSON-Dateien im selben Verzeichnis befinden, können wir JSON mit lesen file_get_contents("test.json"); (Keine Notwendigkeit, den Pfad zu setzen).
– Chetabahana
16. April 2015 um 9:55 Uhr
@Chetabahana Das ist eigentlich nicht richtig. Wenn Sie einen relativen Pfad wie z test.json, dann wird der Pfad relativ zum aktuellen Verzeichnis ausgewertet, nicht unbedingt dort, wo sich das PHP-Skript befindet. Auf Bash können Sie das aktuelle Verzeichnis durch Eingabe von ermitteln pwd.
– Flimmer
28. August 2019 um 13:22 Uhr
@Flimm Wenn PHP und JSON und die Ausführung im selben Verzeichnis erfolgen, muss der absolute Pfad der JSON-Datei nicht angegeben werden. Richtig?
– Nguai al
21. Januar 2021 um 4:33 Uhr
@Nguaial Das hängt davon ab, was das aktuelle Arbeitsverzeichnis ist. Angenommen, Sie haben eine PHP-Datei /home/user/project/test.php und eine JSON-Datei /home/user/project/json.json. Wenn Ihre aktuelle Arbeit ist /home/userum dann die PHP-Datei auszuführen, die Sie eingeben würden php project/test.php. In diesem Fall müsste die PHP-Datei auf die JSON-Datei verweisen als project/test.json da relative Pfade relativ zum aktuellen Arbeitsverzeichnis sind, nicht unbedingt zum übergeordneten Verzeichnis der PHP-Datei.
Ziemlich großartig, aber die ganze Sache mit der Stückliste (BOM) hat mich total verwirrt. äh… wovon redest du? Bin ich der einzige Typ, der sich über die Verwendung mysteriöser, ungeklärter Abkürzungen ärgert? Okay, Abkürzungen zu verwenden, aber bitte erklären Sie When First Used (WFU) … danke.
– zipzit
12. Februar 2015 um 1:26 Uhr
BOM = Byte Order Mark.
– schnell
2. März 2015 um 9:35 Uhr
en.wikipedia.org/wiki/Byte_order_mark Typisches Problem, wenn Sie mit json sowohl auf Mac als auch auf PC arbeiten, da sie unterschiedliche Standardtextformate verwenden.
– schnell
2. März 2015 um 9:41 Uhr
Dieser Beitrag versucht nicht, die gestellte Frage zu beantworten
Es ist mir völlig ein Rätsel, dass niemand darauf hingewiesen hat, dass Ihre anfänglichen “Tags” falsch sind. Sie erstellen ein Objekt mit {}, während Sie mit ein Array erstellen könnten [].
[ // <-- Note that I changed this
{
"name" : "john", // And moved the name here.
"status":"Wait"
},
{
"name" : "Jennifer",
"status":"Active"
},
{
"name" : "James",
"status":"Active",
"age":56,
"count":10,
"progress":0.0029857,
"bad":0
}
] // <-- And this.
Mit dieser Änderung wird der JSON als Array statt als Objekt geparst. Und mit diesem Array können Sie machen, was Sie wollen, wie Loops usw.
Sie haben recht, wenn Sie auf die Array-Sache hinweisen.
– Stephen Adelakun
23. August 2016 um 8:40 Uhr
Ach meins. Ich sollte hinzufügen, dass Sie den Schlüssel im json des OP entfernt zu haben scheinen, während Sie in ein Array konvertieren. Also hat der OP recht.
– Stephen Adelakun
23. August 2016 um 8:51 Uhr
“Aber weil ich die Namen (wie John, Jennifer) und alle verfügbaren Schlüssel nicht kenne”. Er scheint die Schlüssel nicht zu kennen, also ist die einzige Möglichkeit, die Sammlung zu durchqueren, eine Schleife. Diese Art sagt mir, dass er keinen direkten Zugriff auf die Werte per Schlüssel hat.
– David
24. August 2016 um 19:25 Uhr
Dieser Beitrag beantwortet nicht die Frage, wie man einen JSON-String analysiert und auf Subarray-Elemente von unbekannten Schlüsseln der ersten Ebene zugreift. Dies ist keine Antwort und sollte ein Kommentar unter der Frage sein. Es sieht fast so aus, als würden Sie empfehlen, die Datei zu lesen und dann durch Zeichenfolgenfunktionen nach Ihren Wünschen zu mutieren. Ich verstehe es nicht.
– mickmackusa
28. März 2019 um 11:26 Uhr
Nein, ich weise darauf hin, dass die Struktur der Datei für den Zweck, den er liest, falsch ist. Und deshalb beantwortet es die Frage. Und es scheint tatsächlich, dass Sie es nicht verstehen, weil ich nichts über String-Funktionen gesagt habe. Das ist einfach albern.
Sie haben recht, wenn Sie auf die Array-Sache hinweisen.
– Stephen Adelakun
23. August 2016 um 8:40 Uhr
Ach meins. Ich sollte hinzufügen, dass Sie den Schlüssel im json des OP entfernt zu haben scheinen, während Sie in ein Array konvertieren. Also hat der OP recht.
– Stephen Adelakun
23. August 2016 um 8:51 Uhr
“Aber weil ich die Namen (wie John, Jennifer) und alle verfügbaren Schlüssel nicht kenne”. Er scheint die Schlüssel nicht zu kennen, also ist die einzige Möglichkeit, die Sammlung zu durchqueren, eine Schleife. Diese Art sagt mir, dass er keinen direkten Zugriff auf die Werte per Schlüssel hat.
– David
24. August 2016 um 19:25 Uhr
Dieser Beitrag beantwortet nicht die Frage, wie man einen JSON-String analysiert und auf Subarray-Elemente von unbekannten Schlüsseln der ersten Ebene zugreift. Dies ist keine Antwort und sollte ein Kommentar unter der Frage sein. Es sieht fast so aus, als würden Sie empfehlen, die Datei zu lesen und dann durch Zeichenfolgenfunktionen nach Ihren Wünschen zu mutieren. Ich verstehe es nicht.
– mickmackusa
28. März 2019 um 11:26 Uhr
Nein, ich weise darauf hin, dass die Struktur der Datei für den Zweck, den er liest, falsch ist. Und deshalb beantwortet es die Frage. Und es scheint tatsächlich, dass Sie es nicht verstehen, weil ich nichts über String-Funktionen gesagt habe. Das ist einfach albern.
Versuche dies Antworten sind auf StackOverflow von geringem Wert, da sie sehr wenig dazu beitragen, das OP und zukünftige Forscher zu schulen. Wenn Sie diese Antwort auf der Seite belassen, erklären Sie bitte, wie Ihre Antwort funktioniert und warum sie ratsam ist.
– mickmackusa
1. September 2018 um 3:46 Uhr
9937200cookie-checkWie kann ich eine JSON-Datei mit PHP parsen? [duplicate]yes
Sie sind auf dem richtigen Weg. Schlagen Sie die Syntax für foreach nach (Sie sollten Schlüssel und Werte erhalten). Noch nicht aufgeben!
– Stefan Mai
3. Dezember 2010 um 8:12 Uhr
@ Stefan Mai:
foreach($variable as $key => $val)
sollte das sein was du willst 🙂– Bojangles
3. Dezember 2010 um 8:15 Uhr
@JamWaffles Haha, danke. Ich hatte gehofft, dass OP etwas Erfahrung beim Nachschlagen sammeln könnte. Upvotes, weil es wirklich alles ist, was er/sie braucht.
– Stefan Mai
3. Dezember 2010 um 8:16 Uhr
Nebenbemerkung: Ich schlage vor, Sie konfigurieren Ihr PHP-Setup so, dass alle Arten von Fehlermeldungen angezeigt werden, einschließlich
notices
– Alvaro González
3. Dezember 2010 um 8:39 Uhr
Können Sie erläutern, was Sie aus dem “Parsen” des JSON herausholen möchten: dh welche Aufgabe versuchen Sie mit Ihrem Code zu erfüllen (wie: “Alle Status ausgeben”, “Namen finden, bei denen der Status xyz ist”, “find alle Informationen für xyz”)?
– Salat
3. Dezember 2010 um 10:43 Uhr