Bernhard: zugreifen auf bestimmtes Feld in einem Array

Huhu,

ich schaffe es nicht auf einen bestimmten Wert in einem PHP array zuzugreifen.

Die erste Eben kann sich ja immer ändern. Wie kann ich es bewerkstelligen das ich zum Beispiel das array mit der id 231 und den** Content** davon bekomme.

Array
(
    [0] => Array
        (
            [id] => 231
            [typ] => 1
            [titel] => Sansiba
            [content] => 874808
        )

[1] => Array
        (
            [id] => 122
            [typ] => 1
            [titel] => Nairobi
            [content] => 334535f
        )
)

Bernhard

  1. Hallo

    Die erste Eben kann sich ja immer ändern. Wie kann ich es bewerkstelligen das ich zum Beispiel das array mit der id 231 und den** Content** davon bekomme.

    Array
    (
        [0] => Array
            (
                [id] => 231
                [typ] => 1
                [titel] => Sansiba
                [content] => 874808
            )
    
        [1] => Array
            (
                [id] => 122
                [typ] => 1
                [titel] => Nairobi
                [content] => 334535f
            )
    )
    

    Die kurze Antwort lautet echo $array[n]['content'];. Da du vermutlich erst die gewünschte ID ($array[n]['id']) ermitteln willst, gibt es noch die lange Antwort, die da lautet, dass du die IDs (zum Beispiel in einer Schleife) prüfen musst, um an der richtigen Stelle, also bei dem richtigen Arrayelement, auf das Element $array[n]['id'] dieses speziellen Eintrags zuzugreifen.

    Tschö, Auge

    --
    Ein echtes Alchimistenlabor musste voll mit Glasgefäßen sein, die so aussahen, als wären sie beim öffentlichen Schluckaufwettbewerb der Glasbläsergilde entstanden.
    Hohle Köpfe von Terry Pratchett
    1. Hallo,

      Array
      (
          [0] => Array
              (
                  [id] => 231
                  [typ] => 1
                  [titel] => Sansiba
                  [content] => 874808
              )
      
          [1] => Array
              (
                  [id] => 122
                  [typ] => 1
                  [titel] => Nairobi
                  [content] => 334535f
              )
      )
      

      Die kurze Antwort lautet echo $array[n]['content'];. Da du vermutlich erst die gewünschte ID ($array[n]['id']) ermitteln willst, gibt es noch die lange Antwort, die da lautet, dass du die IDs (zum Beispiel in einer Schleife) prüfen musst, um an der richtigen Stelle, also bei dem richtigen Arrayelement, auf das Element $array[n]['id'] dieses speziellen Eintrags zuzugreifen.

      und dann hätte ich noch den Tipp, schon bei der Erstellung des Arrays anders vorzugehen - und nicht einen fortlaufenden numerischen Index als Primärschlüssel zu verwenden, sondern die ID, nach der man später sucht.

      Live long and pros healthy,
       Martin

      --
      Lasst uns ins Horn brechen und aufstoßen. Höchste Zeit, auf den Weg zu machen.
      (mit freundlichem Dank an Tabellenkalk für die Ergänzung 😀)
      1. Hello,

        Hallo,

        Array
        (
            [0] => Array
                (
                    [id] => 231
                    [typ] => 1
                    [titel] => Sansiba
                    [content] => 874808
                )
        
            [1] => Array
                (
                    [id] => 122
                    [typ] => 1
                    [titel] => Nairobi
                    [content] => 334535f
                )
        )
        

        Die kurze Antwort lautet echo $array[n]['content'];. Da du vermutlich erst die gewünschte ID ($array[n]['id']) ermitteln willst, gibt es noch die lange Antwort, die da lautet, dass du die IDs (zum Beispiel in einer Schleife) prüfen musst, um an der richtigen Stelle, also bei dem richtigen Arrayelement, auf das Element $array[n]['id'] dieses speziellen Eintrags zuzugreifen.

        und dann hätte ich noch den Tipp, schon bei der Erstellung des Arrays anders vorzugehen - und nicht einen fortlaufenden numerischen Index als Primärschlüssel zu verwenden, sondern die ID, nach der man später sucht.

        Aber nicht, dass Du das Array nachher sowieso anders herum aufbaust. Das wäre ja genau für solche Anwendungsfälle viel zu praktisch ;-D

        Lesen und verstehen strengstens verboten.

        Glück Auf
        Tom vom Berg

        --
        Es gibt nichts Gutes, außer man tut es!
        Das Leben selbst ist der Sinn.
        1. Tach!

          Aber nicht, dass Du das Array nachher sowieso anders herum aufbaust. Das wäre ja genau für solche Anwendungsfälle viel zu praktisch ;-D

          Sicher? Wenn du ein Spaltenarray hast, dann kannst du auf Datensätze nicht per Key zugreifen, dann musst du die Suche anwerfen. Und dann hast du auch keinen Record, den man einfach umherreichen kannst. Ich sehe nach wie vor keinen wirklichen Vorteil gegenüber datensatzbasierter Speicherung.

          dedlfix.

          1. Hello,

            Aber nicht, dass Du das Array nachher sowieso anders herum aufbaust. Das wäre ja genau für solche Anwendungsfälle viel zu praktisch ;-D

            Sicher? Wenn du ein Spaltenarray hast, dann kannst du auf Datensätze nicht per Key zugreifen, dann musst du die Suche anwerfen. Und dann hast du auch keinen Record, den man einfach umherreichen kannst. Ich sehe nach wie vor keinen wirklichen Vorteil gegenüber datensatzbasierter Speicherung.

            PHP (bis V7.x) kennt sowieso keine "Records" oder "Structures" (Mit Ausnahme der Pack-Funktionen), oder wurde das in PHP 8 geändert?

            Aber wenn Du ein Teil der (virtuellen) Baumstruktur "weitergeben" willst, kannst Du die zusammengehörigen Daten mit den universellen Funktionen, die ich vorgestellt habe, jederzeit zu einem solchen "Record" zusammenfassen.

            Der Vorteil ist, dass alle Spalten gleichzeitog sortiert zur Verfügung stehen können und für die üblichen Sortierungen und Aggregatsfunktionen die in PHP bereits vorliegenden Funktionen genutzt werden können. Das bleibt nun dem Anwendungsprogrammierer überlassen zu beurteilen, welche Vorgehensweise für ihn leichter verständlich und einfacher anwendbar ist.

            iIne Sortierung mit Backreferenz-Funktionen aufzubauen zu müssen ist auch nicht vorteilhaft, zumal hier für jede Sortierung der Vorgang erneut durchgeführt werden muss und dabei das gesamte Array umsortiert wird, nicht nur die betroffene Spalte.

            Glück Auf
            Tom vom Berg

            --
            Es gibt nichts Gutes, außer man tut es!
            Das Leben selbst ist der Sinn.
      2. ich bekomme sie mittels pdo aus der Datenbank

        $stat->fetchAll(PDO::FETCH_ASSOC);

        ich könnte es mit

        fetchAll(PDO::FETCH_GROUP);

        dann habe ich

        
         [231] => Array
                (
                    [0] => Array
                        (
        					[typ] => 1
        					[titel] => Sansiba
        					[content] => 874808
        

        wenn ich es so mache, ist das okey?

        $ausgabe[231][0]['titel'];

        1. Hallo

          ich könnte es mit

          fetchAll(PDO::FETCH_GROUP);

          dann habe ich

          
           [231] => Array
                  (
                      [0] => Array
                          (
          					[typ] => 1
          					[titel] => Sansiba
          					[content] => 874808
          

          wenn ich es so mache, ist das okey?

          $ausgabe[231][0]['titel'];

          Nein. Es sollte, wenn dann, schon $ausgabe[n][231]['titel'] sein.

          Mit print_r sollte die Ausgabe so aussehen:

          Array
              (
                  [231] => Array
                      (
                      [typ] => 1
                      [titel] => Sansiba
                      [content] => 874808
                      )
                  /* weitere Arrayelemente*/
              )
          

          Dann kommst du mit $array[231]['content'] easy, peasy an den gewünschten Inhalt ran.

          Tschö, Auge

          --
          Ein echtes Alchimistenlabor musste voll mit Glasgefäßen sein, die so aussahen, als wären sie beim öffentlichen Schluckaufwettbewerb der Glasbläsergilde entstanden.
          Hohle Köpfe von Terry Pratchett
        2. Hallo Bernhard,

          Auge schreibt:

          Nein. Es sollte, wenn dann, schon $ausgabe[n][231]['titel'] sein.

          Ich nehme an, dass das [n] ein Irrtum war und da nicht hingehört. Aber dieses [0], das Du dazwischen hast, ist den speziellen Gegebenheiten von FETCH_GROUP geschuldet - es liefert Gruppen und die können nun mal mehr als einen Eintrag haben - und für dieses Szenario völlig okay.

          FETCH_GROUP kann für Dich eine gute Lösung sein. Die Aufgabe, den richtigen Satz herauszusuchen, löst sich dann in einer Programmzeile selbst, und Du brauchst nichts weiter zu programmieren.

          Man könnte natürlich auch fragen: Wenn Du schon weißt, welche ID Du brauchst, warum baust Du die Query nicht gleich passend und überlässt das Problem der Datenbank? Aber ich nehme mal an, dass Du Gründe dafür hast.

          Wenn Du sicher bist, dass Du keine zwei Sätze mit gleichem Wert für die ID hast, hätte ich noch zwei Alternativen für Dich.

          (1) Du könntest Dir beim Einlesen des Abfrageergebnisses etwas mehr Mühe machen und statt fetchAll eine Schleife programmieren, die das Ergebnis Row für Row einliest. Dann kannst Du das Ausgabe-Array sofort mit der id indexiert erzeugen.

          $ok = $statement->execute();
          if (!ok) { // Fehlerbehandlung }
          $ausgabe = ARRAY();
          while ($row = $statement->fetch(PDO::FETCH_ASSOC)
          {
             $ausgabe[$row['id']] = $row;
          }
          
          // und dann:
          $content = $ausgabe[231]['content'];
          

          (2) Du könntest Dir eine allgemeine Hilfsfunktion schreiben, die Dir ein Array aus Datenbank-Rows nach einer eindeutigen Spalte indexiert. Da gibt es leider nichts Fertiges in der Library.

          function array_index($array, $keyColumn) {
             if (!is_array($array))
                return false;
          
             $ergebnis = ARRAY();
             foreach ($array as $eintrag) 
             {
                $ergebnis[$eintrag[$keyColumn]] = $eintrag;
             }
             return $ergebnis;
          }
          
          ...
          
          $ausgabe = array_index($statement->fetchAll(PDO::FETCH_ASSOC)), 'id');
          

          Oder Du machst es so wie in meiner ersten Antwort beschrieben und lässt eine Suchschleife über das Ergebnis laufen. Entweder selbst programmiert, oder als Teil von array_filter.

          Rolf

          --
          sumpsi - posui - obstruxi
        3. Hello,

          
           [231] => Array
                  (
                      [0] => Array
                          (
          					[typ] => 1
          					[titel] => Sansiba
          					[content] => 874808
          

          wenn ich es so mache, ist das okey?

          Manchmal kann man ruhig ein wenig Redundanz zulassen

          Beispielhaft angedeutet:

          
             $_table = array();
            
             while (!eof())
             {
                 $_line = fetch_assoc(...); 
                 $_table[$_line['id']] = $_line;
             } 
          
             print_r($_table);
          

          Glück Auf
          Tom vom Berg

          --
          Es gibt nichts Gutes, außer man tut es!
          Das Leben selbst ist der Sinn.
  2. Hallo Bernhard,

    zum Nachlesen in php.net.

    Grüße, Martl

  3. Hallo Bernhard,

    du hast ein Array $arr. Dessen Einträge sind Subarrays. Eins der Subarrays enthält einen Eintrag mit Schlüssel "id" und einem bestimmten Wert. Zum Beispiel 231.

    Dieses Subarray möchtest Du finden? Und darin dann auf den Eintrag mit Schlüssel 'content' zugreifen?

    Du brauchst für den ersten Teil eine Kreuzung aus array_search und array_filter, die es aber leider nicht in der Standard-Arraysammlung gibt.

    Schreibe Dir eine Funktion, der Du $arr und den gesuchten Wert für 'id' übergibst, und die das Subarray liefert. In diesem Subarray dann auf den 'content' Eintrag zuzugreifen wird Dir sicherlich gelingen.

    In der Funktion lässt Du eine foreach ($arr as $subArray) laufen. In der Schleife hast Du jeweils eins der Subarrays im Zugriff. Dort prüfst Du die ID und wenn sie stimmt, verlässt Du Schleife und Funktion mit einem return $subArray. Hinter der Schleife schreibst Du return FALSE;, um in schlechter alter PHP Tradidition das Nichtfinden eines Wertes durch Rückgabe von FALSE anzuzeigen.

    Du kannst natürlich auch versuchen, array_filter anzuwenden. Das ist etwas abstrakter. Dieser Funktion übergibst Du ein so genanntes „Callable“, das die Prüfung auf die richtige ID vornimmt. Man muss dabei nur an die use-Klausel denken, um die gesuchte ID ins Callable hineinzubekommen, denn die steht ja bestimmt in einer Variablen:

    Ein Callable ist entweder eine anonyme Funktion, wie gleich gezeigt, oder der Name einer normalen Funktion, die Du vorher definiert hast. Die use-Klausel ist aber wichtig, sonst kommt sie an $gesucht nicht heran.

    $gesucht = 231;
    $array = array(array(...), array(...));   // Deine Daten
    
    $ergebnis = array_filter($array, function($eintrag) use($gesucht)
                                     {
                                        return $eintrag['id'] === $gesucht;
                                     });
    

    In $ergebnis findest Du danach ein Array mit so vielen Einträgen, wie gefunden wurden. Wenn die ID eindeutig ist, nur einer.

    if (count($ergebnis) > 0) 
    {
       $inhalt = $ergebnis[0]['content'];
    }
    

    Rolf

    --
    sumpsi - posui - obstruxi