Sukan: json_decode auslesen und übergebn an Variable und einzeln abfragen

Hallo meine Damen und Herren,

ich hoffe Sie können mir bei meinem Problem mit einer API weiterhelfen. Ich lese die Date über und übergebe das Datenfile dann

$jsonarray = json_decode($jsonfile);

anschließend gebe ich es zum Test aus:

var_dump( $jsonarray );

bis hier ist alles perfekt. Doch wie bewerkstellige ich es das ich nur die Daten der ["Arrival"]=> in meinem Array habe und dies ausgeben kann. Ich habe eine Strich mit ######## gemacht ab welchen Daten ich meine. Irgendwie komme ich nicht dahinter wie ich auf diese Daten zugreifen kann



object(stdClass)#45 (1) {
  ["ArrivalBoard"]=>
  object(stdClass)#4 (2) {
    ["noNamespaceSchemaLocation"]=>
    string(77) "https://open-api.bahn.de/bin/rest.exe/v1.0/xsd?name=hafasRestArrivalBoard.xsd"
    ["Arrival"]=>
    array(20) {
      [0]=>
###################################
      object(stdClass)#5 (9) {
        ["name"]=>
        string(8) "ICE 1515"
        ["type"]=>
        string(3) "ICE"
        ["stopid"]=>
        string(7) "8000261"
        ["stop"]=>
        string(12) "München Hbf"
        ["time"]=>
        string(5) "21:06"
        ["date"]=>
        string(10) "2018-02-23"
        ["origin"]=>
        string(14) "Hamburg-Altona"
        ["track"]=>
        string(2) "22"
        ["JourneyDetailRef"]=>
        object(stdClass)#6 (1) {
          ["ref"]=>
          string(228) "xxxxxxxxxxx"
        }
      }
	   [1]=>
      object(stdClass)#7 (9) {
        ["name"]=>
        string(7) "ICE 725"
        ["type"]=>
        string(3) "ICE"
        ["stopid"]=>
        string(7) "8000261"
        ["stop"]=>
        string(12) "München Hbf"
        ["time"]=>
        string(5) "21:10"
        ["date"]=>
        string(10) "2018-02-23"
        ["origin"]=>
        string(9) "Essen Hbf"
        ["track"]=>
        string(2) "19"
        ["JourneyDetailRef"]=>
        object(stdClass)#8 (1) {
          ["ref"]=>
          string(229) "xxxxxxxxxxx"
        }
      }

  1. Tach!

    anschließend gebe ich es zum Test aus:

    var_dump( $jsonarray );

    Es ist nur kein Json-Array, sondern ein PHP-Objekt. Auf Eigenschaften von Objekten greift man anders zu als auf Felder von Arrays.

    $array['feld']
    $object->eigenschaft
    

    Doch wie bewerkstellige ich es das ich nur die Daten der ["Arrival"]=> in meinem Array habe und dies ausgeben kann.

    Durchhangeln. Je nachdem ob das nächstliegende innere Element ein Array oder ein Objekt ist - was man ja dem Dump entnehmen kann - mit der Array- oder der Objekt-Syntax.

    Im Zweifelsfall immer schön eins nach dem anderen und nach jeden Zwischenschritt eine Testausgabe vornehmen, bevor du weitergehst, damit du gleich sehen kannst, ob es bis dahin richtig war oder nicht.

    dedlfix.

    1. Danke für den Beitrag. Wie kann ich mich den durchhangeln?

      1. Tach!

        Wie kann ich mich den durchhangeln?

        Die Struktur des Gebildes wird dir durch den Dump angezeigt. Du kannst auch mal print_r() statt var_dump() probieren, das ergibt eine andere Ausgabe, die vielleicht etwas übersichtlicher ist.

        Das erste/äußere Element ist ein Objekt. Der nächste Schritt zum Ziel geht über dessen Eigenschaft ArrivalBoard. Also $jsonarray->ArrivalBoard. Das ist wieder ein Objekt, dessen dich interessierende Eigenschaft Arrival heißt, also $jsonarray->ArrivalBoard->Arrival. Das ist ein Array und für das nimmst du nicht die Pfeilsyntax, sondern den Array-Zugriff mit den eckigen Klammern und der Nummer des Index darin.

        dedlfix.

      2. Hallo Sukan,

        wie Du merkst, duzen wir uns hier 😀.

        Was Objekte und Arrays grundsätzlich sind, ist Dir bekannt? Ich will Dich mit der Frage nicht ärgern, sondern herausfinden, ob noch jemand ein paar Erklärungen nachlegen muss oder nicht. Zum Selberlesen gibt's hier einen Haufen Informationen zum Thema PHP Klassen und Objekte. Auch auf Englisch, falls es dir lieber ist, php.net hat oben rechts den Schalter für Sprachen.

        Dein Dump beginnt so:

        object(stdClass)#45 (1) {
          ["ArrivalBoard"]=>
          object(stdClass)#4 (2) {
            ["noNamespaceSchemaLocation"]=>
            string(77) "https://open-api.bahn.de/bin/rest.exe/v1.0/xsd?name=hafasRestArrivalBoard.xsd"
            ["Arrival"]=>
            array(20) {
              [0]=>
        ###################################
              object(stdClass)#5 (9) {
                ["name"]=>
                string(8) "ICE 1515"
                ["type"]=>
                string(3) "ICE"
        

        D.h. was die Bahn Dir da geliefert hat, ist ein komplexes Gebilde aus ineinander geschachtelten Objekten und Arrays. Ganz außen hast Du ein stdClass-Objekt. Dieses Objekt hat die Eigenschaft ArrivalBoard. Vielleicht gibt es noch mehr, das ist in deinem Dump nicht ersichtlich.

        Innerhalb des ArrivalBoard sehen wir zwei Eigenschaften. Eine heißt noNamespaceSchemaLocation und ist wohl eher technisch zu sehen. Die andere heißt Arrivals und die interessiert Dich.

        Die Arrivals sind nun ein Array. Und zwar ein Array von weiteren stcClass-Objekten, diese Objekte haben Eigenschaften wie name, type oder JourneyDetailRef - wobei eine JourneyDetaiRef wiederum ein stdClass-Objekt ist mit Eigenschaften wie ref. Andere sehen wir nicht mehr.

        Diesen Stufen musst Du einzeln nachsteigen. Von $jsonArray zu ArrivalBoard, von ArrivalBoard zu Arrivals, von Arrivals zu einem Array-Element, vom Array-Element zu Eigenschaften wie name oder JourneyDetailRef. Dazu wendest Du immer wieder die von dedlfix genannten Operatoren an. Das kann man - wenn man testet und nicht genau weiß was passiert - einzeln machen und die Schritte in Variablen zwischenspeichern. Das meinte dedlfix mit „durchhangeln“.

        Wenn man aber weiß, dass man ein Objekt in einem Objekt erreichen will, kann man das Speichern in einer Variablen auch weglassen. Statt

        $b = $a->b;
        $c = $b->c;
        

        kann man - wenn man $b nicht weiter braucht - auch kürzer schreiben

        $c = $a->b->c;
        

        So, nun hast Du hoffentlich das Handwerkszeug, das Du brauchst.

        Rolf

        --
        sumpsi - posui - clusi
        1. Dank Eurer Hilfe habe ich mein Anliegen jetzt so gelöst:

          $jsonfile = file_get_contents('https://open-api.bahn.de/bin/rest.exe/arrivalBoard?authKey=xxxxxxxxx&lang=de&id=008000261&date=2018-02-24&time=17%3a00&format=json'); 
          
          
          $jsonarray = json_decode($jsonfile); 
          $anzahl = count ( $jsonarray->ArrivalBoard->Arrival);
          for ($x = 0; $x < $anzahl; $x++)
          {
          echo $jsonarray->ArrivalBoard->Arrival[$x]->name;
          

          Danker hierfür.

          Wenn ich die Ausgabe aber umkehren möchte, also das die

          array(20) { [0]=>

          Ausgabe nicht

          0 1 2 3 4

          sondern

          4 3 2 1 0

          ist, muss das auszugebende Array sortiert werden. Kann ich das direkt oder muss ich die Daten erst extrahieren um an das gewünschte Ergebniss zu kommen.

          1. Tach!

            $anzahl = count ( $jsonarray->ArrivalBoard->Arrival);
            for ($x = 0; $x < $anzahl; $x++)
            

            Für das vollständige Durchlaufen eines Arrays gibt es foreach.

            Wenn ich die Ausgabe aber umkehren möchte,

            ... dann nimmt man dazu die Funktion array_reverse().

            Kann ich das direkt oder muss ich die Daten erst extrahieren um an das gewünschte Ergebniss zu kommen.

            Die Funktion nimmt ein Array entgegen und gibt ein neues zurück. Zwischenvariablen braucht man nicht, um das Eingangsarray durch array_reverse() zu schicken und dessen Ergebnis direkt im foreach zu verwenden. Ein Einzeiler also. Wenn du dir aber unsicher bist, kannst du die Schritte auch (erst einmal) einzeln durchführen und dir dabei die Zwischenergebnisse anschauen.

            dedlfix.

          2. Hallo,

            0 1 2 3 4

            sondern

            4 3 2 1 0

            ich würde hier aber reverse nehmen. Das sollte auch bei Arrays in Objekten funktionieren.

            Gruß
            Jürgen

            Edit Jetzt habe ich nicht weit genug gescrollt und dedlfixens Antwort übersehen. Und dann habe ich bei json auch noch an javascript gedacht. Tztztz

            1. @@JürgenB

              Und dann habe ich bei json auch noch an javascript gedacht. Tztztz

              JSON verhält sich zu JS wie JavaScript zu Java.

              LLAP 🖖

              --
              „Wer durch Wissen und Erfahrung der Klügere ist, der sollte nicht nachgeben. Und nicht aufgeben.“ —Kurt Weidemann
              1. Hallo Gunnar,

                immerhin habe ich es innerhalb von drei Minuten gemerkt und kommentiert. 😀

                Gruß
                Jürgen

              2. hi @Gunnar Bittersmann

                Und dann habe ich bei json auch noch an javascript gedacht. Tztztz

                JSON verhält sich zu JS wie JavaScript zu Java.

                Jawa oder MZ war zu meiner Jugendzeit die Frage 😉

                Heute bekenne ich mich zum Java~Sun~Einrückungsstil 😉

                MfG