Verschachtelte Json in PHP ausgeben

Status
Dieses Thema wurde gelöst! Zur Lösung gehen…

PrincePitt

Grünschnabel
Moin Moin.
Ich habe ein Problem und habe mir schon die ganze Nacht um die Ohren geschlagen nun frage ich doch mal um Hilfe damit ich doch voran kommen.
Ich erhalte von einen 3 Anbieter ein Json Link dieser soll ausgewertet auf der Internetseite vom Kunden dargestellt werden. Ich bin mir nicht sicher ob es gestern schon zu spät war oder ich einfach ein Hänger hatte. Ich bekomme die grundlegenden abfragen ausgeben aber die Verschachtelungen bekomme ich nicht abgefragt. Kann mir bitte jemand sagen was ich abfragen muss ?

Das ist die Json Stark vereinfacht.
ich muss z.b. auf die werte in "affectedProduct" und die namen zugreifen und die in der forech schleife mit ausgeben. Wie ihr sehen werdet kann es vorkommen das dort mehere werte auftauchen.

JSON:
"Message": [{
        "affectedProduct": [{
            "name": "868",
            "operatorCode": "BBG",
            "operator": "xxx"
        }, {
            "name": "891",
            "operatorCode": "BBG",
            "operator": "xxx"
        }, {
            "name": "899",
            "operatorCode": "BBG",
            "operator": "xxx"
        }, {
            "name": "901",
            "operatorCode": "BBG",
            "operator": "xxx"
        }],
        "channel": [{
            "name": "TIMETABLE",
            "validFromTime": "16:23:00",
            "validFromDate": "2021-08-04",
            "validToTime": "23:59:00",
            "validToDate": "2021-10-15"
        }],
        "messageCategory": [{
            "id": 1
        }],
        "id": "FREETEXT_132152",
        "act": true,
        "head": "Header",
        "text": "Test",
        "company": "BBG",
        "category": "1",
        "priority": 100,
        "products": 8,
        "sTime": "16:19:00",
        "sDate": "2021-08-04",
        "eTime": "23:59:00",
        "eDate": "2021-10-15",
        "modTime": "10:21:14",
        "modDate": "2021-09-15"
    }, {
        "affectedProduct": [{
            "name": "909",
            "operatorCode": "BBG",
            "operator": "xxx"
        }],
        "channel": [{
            "name": "TIMETABLE",
            "validFromTime": "16:44:00",
            "validFromDate": "2021-09-28",
            "validToTime": "23:59:00",
            "validToDate": "2021-10-17"
        }],
        "messageCategory": [{
            "id": 1
        }],
        "id": "FREETEXT_138022",
        "act": true,
        "head": "Head",
        "text": "Test",
        "company": "BBG",
        "category": "1",
        "priority": 100,
        "products": 8,
        "sTime": "00:00:00",
        "sDate": "2021-10-04",
        "eTime": "23:59:00",
        "eDate": "2021-10-17",
        "modTime": "16:46:24",
        "modDate": "2021-09-28"
    },

Und das wäre meine Php abfrage.

PHP:
$data = json_decode(file_get_contents("HIER STEHT DER LINK DRIN"), true);

foreach ($data['Message'] as $message=>$value) {
            echo $value["id"];
            echo $value["affectedProduct"]["name"];
        }

Bei der abfrage z.b. von "affectedProduct" wird mir allerdings nichts ausgegeben und bei einer var_dump Ausgabe erhalte ich nur NULL.
Wo stehe ich gerade auf dem Schlauch?
 

Yaslaw

n/a
Moderator
Ich denke nur mal laut

Die Einzelne Unterteile sind Objekte.
M;essage ist ein Array von Objekten
Die Obejekte haben unter anderem das Property affectedProduct. Dieses beinhaltet weider ein Array mit Objekten.

Du hast bei json_decode associative=true gesetzt. Das bedeutet, dass alle Objekte als Arrays zurückgegeben werden.

Zu deiner Frage. $value["affectedProduct"] ist ein Listenarray mit mehreren Objekten (in dem Fall in Form weiterer Arrays). Du musst also nochmals eine Schleife machen oder auf den ersten zugreifen
PHP:
//Auf den ersten zugreifen
foreach ($data['Message'] as $message=>$value) {
    echo $value["affectedProduct"][0]["name"];
}

//Alle Ausgeben
foreach ($data['Message'] as $message=>$value) {
    foreach($value["affectedProduct"] as $affectedProduct){
        echo $affectedProduct['name'];
    }
}
 
Status
Dieses Thema wurde gelöst! Zur Lösung gehen…