Ankündigung

Einklappen
Keine Ankündigung bisher.

Mehrdimensionale Arrays nur bestimmte Daten ausgeben

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Mehrdimensionale Arrays nur bestimmte Daten ausgeben

    Hallo Leute,

    vielleicht könnt ihr mir bitte bei meinen Problem weiter helfen, stehe sowas auf den Schlauch gerade.
    Finde im Netz auch nicht wirklich eine Lösung.

    Habe eine JSON Datei in ein Array decodiert.
    Dieses Array ist Mehrdimensional (7x)
    Möchte gerne nur bestimmte Werte/Daten ausgeben lassen, bei dem Beispiel zb.: sollen nur die Werte ausgegeben werden wo der ORT "lala" ist.
    bzw. wenn das nicht möglich ist wenigstens alles formatiert ausgeben.

    Ist das mit einer FOREACH Schleife möglich? muss ich die 7fach verschachteln ^^?

    Habt ihr nen Tipp für mich
    hab es leider nicht zusammengebracht

    Danke

    mandi

    PHP-Code:
    <?php
    $json_array 
    = [
    "2020" => [
        
    "7" => [ 
                
    "monat" => "Juli",
                
    "data" => [
                    
    "0" =>[
                        
    "date" =>"8.7.2020",
                        
    "ort" => [
                            
    "0" =>"lala",
                            
    "1" => "oee"
                                
    ]
                          ]
                      ]
                  ],

        
    "8" => [ 
                
    "monat" => "august",
                
    "data" => [
                    
    "0" =>[
                        
    "date" =>"8.8.2020",
                        
    "ort" => [
                            
    "0" =>"zrhg",
                            
    "1" => "sbg"
                        
    ]],
                    
    "1" =>[
                        
    "date" =>"16.8.2020",
                        
    "ort" => [
                            
    "0" =>"rara",
                            
    "1" => "sbg"
                        
    ]],
                     
    "2" =>[
                        
    "date" =>"22.8.2020",
                        
    "ort" => [
                            
    "0" =>"sbg",
                            
    "1" => "lala"
                            
    ]
                         ]
                    ]
                ]
            ]
    ];

  • #2
    Ich finde im Netz schon eine Lösung.

    Ich empfehle generell auf englisch zu suchen meiner Erfahrung nach.
    Gerade zu solch "einfachen" Problemen gibt es bereits Lösungen. Zu 100 %.

    http://stackoverflow.com/questions/4...ensional-array

    Kommentar


    • #3
      Einen allgemeinen Zugang zu Fragestellungen der beschriebenen Art liefert JSONPath

      https://github.com/Galbar/JsonPath-PHP

      Möglicherweise genügt in diesem Fall auch eine Ad-hoc-Lösung mit Hilfe einer rekursiven Funktion:

      PHP-Code:
      function getArrayPathRecursively($path$array) {
          static 
      $paths = [];
          static 
      $locations = [];
          foreach(
      $array as $key => $subarray) {
              if (
      $key === 'ort' && in_array('lala'$subarray)) {
                  
      $paths[] = array_merge($path,[$key]);
                  
      $locations[] = $subarray;
              } elseif (
      is_array($subarray)) {
                  
      getArrayPathRecursively(array_merge($path, [$key]), $subarray);
              }
          }
          return [
      'paths' => $paths'locations' => $locations];
       }

      print_r(getArrayPathRecursively([],$json_array)); 

      Kommentar


      • #4
        Hallo Leute,

        danke für die Antworten

        Zitat von hobbyphp Beitrag anzeigen
        Ich finde im Netz schon eine Lösung.

        Ich empfehle generell auf englisch zu suchen meiner Erfahrung nach.
        Gerade zu solch "einfachen" Problemen gibt es bereits Lösungen. Zu 100 %.
        Denk ich mir das es nicht so ein Problem sein sollte bei mir scheitert es im Moment wahrscheinlich am Verständnis.
        Glaub ich fang lieber mal klein an, schau mir in Ruhe alles an, bin doch noch ein Anfänger und frag wegen diesen "Problem" in der Scriptbörse ob mir wer gegen € was bastelt ^^

        mephisto111 Danke! wie komm ich jetzt zum Beispiel zu den Werten von data -> date ?

        JSONPath schaut interessant aus, werd ich mir auch anschauen danke für den Link.

        lg



        Kommentar


        • #5
          Für ein solch spezielles und mehrfach gruppiertes Array wie dein $json_array wirst du kaum eine fertige Lösung finden. Wenn du öfter mit solchen Strukturen zu tun hast lohnt sich solche Tools wie JSONPath näher anzuschauen.

          Wenn ich das mit den PHP-Hausmitteln lösen müsste würde ich wie folgt vorgehen:
          1. Die Gruppierung vom $json_array rückgängig machen. Das sollte mit 2 oder 3 foreach möglich sein. Das Ziel ist eine möglichst flache Struktur ähnlich

          PHP-Code:
          $array = array (
            
          => 
            array (
              
          'year' => 2020,
              
          'month' => 7,
              
          'datas' => "data",
              
          'date' => "8.7.2020",
              
          'ort' => 
              array (
                
          => "lala",
                
          => "oee",
              ),
            ),
            
          => 
            array (
              
          'year' => 2020,
              
          'month' => 8,
              
          'datas' => "data",
              
          'date' => "8.8.2020",
              
          'ort' => 
              array (
                
          => "zrhg",
                
          => "sbg",
              ),
            ),
            
          => 
            array (
              
          'year' => 2020,
              
          'month' => 8,
              
          'datas' => "data",
              
          'date' => "16.8.2020",
              
          'ort' => 
              array (
                
          => "rara",
                
          => "sbg",
              ),
            ),
            
          => 
            array (
              
          'year' => 2020,
              
          'month' => 8,
              
          'datas' => "data",
              
          'date' => "22.8.2020",
              
          'ort' => 
              array (
                
          => "sbg",
                
          => "lala",
              ),
            ),
          ); 
          2. Mit einer solchen Struktur ist es einfach mit array_filter() deine gewünschten Zeilen rauszufiltern.
          PHP-Code:
          $newData array_filter($array, function($row){return in_array('lala',$row['ort']);}); 
          Als resultat bekommst du dann dies:
          PHP-Code:
          array (
            
          => 
            array (
              
          'year' => 2020,
              
          'month' => 7,
              
          'datas' => "data",
              
          'date' => "8.7.2020",
              
          'ort' => 
              array (
                
          => "lala",
                
          => "oee",
              ),
            ),
            
          => 
            array (
              
          'year' => 2020,
              
          'month' => 8,
              
          'datas' => "data",
              
          'date' => "22.8.2020",
              
          'ort' => 
              array (
                
          => "sbg",
                
          => "lala",
              ),
            ),

          Dort auf die gewünschten Informationen zuzugreifen sollte nicht mehr das Problem sein.

          LG jspit

          Kommentar


          • #6
            Ich hab mir mal kurz JsonPath angeschaut. Es ist sehr mächtig und dennoch relativ leicht zu händeln. Habe dies mal für das obige Beispiel probiert:
            PHP-Code:
            $obj = new \jsonPath\JsonObject($arraytrue);
            $result $obj->get('$..data[?(@.ort.0 == "lala" or @.ort.1 == "lala")]'); 
            var_export($result); 
            Resultat:
            PHP-Code:
            array (
              
            => 
              array (
                
            'date' => "8.7.2020",
                
            'ort' => 
                array (
                  
            => "lala",
                  
            => "oee",
                ),
              ),
              
            => 
              array (
                
            'date' => "22.8.2020",
                
            'ort' => 
                array (
                  
            => "sbg",
                  
            => "lala",
                ),
              ),

            Das ganze ist noch gut dokumentiert und die Klasse besteht aus wenigen Dateien ohne weitere Abhängigkeiten welche auch ohne Composer recht flott installiert werden können.
            Meine Empfehlung für dieses Problem hier!

            LG jspit


            Kommentar


            • #7
              Hello,
              jspit vielen dank für deine Hilfe. Habs mir endlich angeschaut.
              Ist genau das was ich gesucht habe
              Vielen Dank

              lg

              mandi

              Kommentar


              • #8
                Hat jemand das Motto "Hilfe zur Selbsthilfe" irgendwo vergraben?

                Kommentar


                • #9
                  Ich sehe das hier das hier im Thread nur ausbaufähige Ansätze und keine fertigen Lösungen gezeigt wurden.
                  Das obige Array kann nur ein stark vereinfachtes Beispiel darstellen und nicht die echte Aufgabe. Die echte Aufgabe steht so vermute ich hier in der Scriptbörse.
                  Die Lösung der Aufgabe ist m.E. nicht ohne Grundkenntnisse und gründliches Studium von JSON-Path möglich.

                  Kommentar

                  Lädt...
                  X