Chris: Mehrdimensionales Array durchsuchen

Hallo,

ich habe eine Art Adressbuch das in einem mehrdimensionalen Array steckt. Im Code wird das wie folgt erzeugt, habe mal nur die ersten drei Einträge aufgelistet.

  
$adressen = array();  
$i = 0;  
  
array_push($adressen[$i][Vorname] = "Christoph");  
array_push($adressen[$i][Nachname] = "Meier");  
array_push($adressen[$i][Spitzname] = "");  
array_push($adressen[$i][Geschäft] = "ja");  
array_push($adressen[$i][Privat] = "ja");  
$i += 1;  
  
array_push($adressen[$i][Vorname] = "Christoph");  
array_push($adressen[$i][Nachname] = "Müller");  
array_push($adressen[$i][Spitzname] = "");  
array_push($adressen[$i][Geschäft] = "nein");  
array_push($adressen[$i][Privat] = "ja");  
$i += 1;  
  
array_push($adressen[$i][Vorname] = "Hannes");  
array_push($adressen[$i][Nachname] = "Schmitt");  
array_push($adressen[$i][Spitzname] = "");  
array_push($adressen[$i][Geschäft] = "ja");  
array_push($adressen[$i][Privat] = "ja");  
$i += 1;  

Ich benötige nun verschiedene Auswertungen.
1. Wie viele Einträge gibt es mit dem Vornamen Christoph?
2. Welche Einträge haben den Vornamen Christoph?

Ich stelle mir das so vor, dass da eine rekursive Suche durch alles gemacht werden muss, und bei jedem Treffer wird der zugehörige Schlüssel in ein Array geschrieben, das kann ich dann wiederum nach Anzahl usw. einfach auswerten.
Nur, mache ich das irgendwie mit array_walk_recursive, mit array_filter oder mit array_keys?
Oder muss ich da foreach-Schleifen mit array_search bauen?

Könnt ihr mir hier einen Ansatz liefern damit ich in die richtige Richtung renne?

Grüße, Chris

  1. Hello,

    ich habe eine Art Adressbuch das in einem mehrdimensionalen Array steckt. Im Code wird das wie folgt erzeugt, habe mal nur die ersten drei Einträge aufgelistet.

    $adressen = array();
    $i = 0;

    array_push($adressen[$i][Vorname] = "Christoph");
    array_push($adressen[$i][Nachname] = "Meier");
    array_push($adressen[$i][Spitzname] = "");
    array_push($adressen[$i][Geschäft] = "ja");
    array_push($adressen[$i][Privat] = "ja");
    $i += 1;

    array_push($adressen[$i][Vorname] = "Christoph");
    array_push($adressen[$i][Nachname] = "Müller");
    array_push($adressen[$i][Spitzname] = "");
    array_push($adressen[$i][Geschäft] = "nein");
    array_push($adressen[$i][Privat] = "ja");
    $i += 1;

    array_push($adressen[$i][Vorname] = "Hannes");
    array_push($adressen[$i][Nachname] = "Schmitt");
    array_push($adressen[$i][Spitzname] = "");
    array_push($adressen[$i][Geschäft] = "ja");
    array_push($adressen[$i][Privat] = "ja");
    $i += 1;

    
    >   
    > Ich benötige nun verschiedene Auswertungen.  
    > 1. Wie viele Einträge gibt es mit dem Vornamen Christoph?  
    > 2. Welche Einträge haben den Vornamen Christoph?  
      
    ich kann es nur immer wiederholen. Man kann die Datenstruktur für drartige Anwendungsfälle auch anders aufbeuen. Das hat den Vorteil, dass man anschließend viele der Aufgaben mit den Standard-Array-Funktionen von PHP lösen kann. Und für dies bisschen "Select, Edit, Append und Delete" kann man sich vie Funtionen schreiben. Und selbst diese sind nicht spezialisiert, sondern wiederverwendbar formulierbar. Das habe ich hier im Archiv schon etliche Male verewigt.  
      
       array\_push($adressen[Vorname][$i] = "Christoph");  
       array\_push($adressen[Nachname][$i] = "Meier");  
       array\_push($adressen[Spitzname][$i] = "");  
       array\_push($adressen[Geschäft][$i] = "ja");  
       array\_push($adressen[Privat][$i] = "ja");  
       $i += 1;  
      
      
    In dieser Baumstruktur werden korrespondierende Zweige erzeugt.  
    Jeder Zweig lässt sich einzeln summieren, sortieren, nach Maximum durchsuchen, usw. und das alles mit Standard-Array\_Funktionen!  
      
      
      
      
      
      
      
    Liebe Grüße aus dem schönen Oberharz  
      
      
    Tom vom Berg  
    ![](http://selfhtml.bitworks.de/Virencheck.gif)  
      
    
    -- 
    Nur selber lernen macht schlau  
    <http://bergpost.annerschbarrich.de>
    
    1. ich kann es nur immer wiederholen. Man kann die Datenstruktur für drartige Anwendungsfälle auch anders aufbeuen. Das hat den Vorteil, dass man anschließend viele der Aufgaben mit den Standard-Array-Funktionen von PHP lösen kann. Und für dies bisschen "Select, Edit, Append und Delete" kann man sich vie Funtionen schreiben. Und selbst diese sind nicht spezialisiert, sondern wiederverwendbar formulierbar. Das habe ich hier im Archiv schon etliche Male verewigt.

      array_push($adressen[Vorname][$i] = "Christoph");
         array_push($adressen[Nachname][$i] = "Meier");
         array_push($adressen[Spitzname][$i] = "");
         array_push($adressen[Geschäft][$i] = "ja");
         array_push($adressen[Privat][$i] = "ja");
         $i += 1;

      In dieser Baumstruktur werden korrespondierende Zweige erzeugt.
      Jeder Zweig lässt sich einzeln summieren, sortieren, nach Maximum durchsuchen, usw. und das alles mit Standard-Array_Funktionen!

      Danke für die schnelle Antwort.
      Jetzt habe ich nur noch eine Frage, warum bin ich da nicht schon früher draufgekommen?  ;-)

      Ganz im Ernst, vielen Dank, das hat mir geholfen. Wenn ich das so wie in deiner Lösung beschrieben aufbaue, dann komme ich wirklich einfach zum Ergebnis.

      Grüße, Chris

    2. Hello,

      wobei das hier ja sogar noch "doppelt gemoppelt" und zudem fehlerhaft ist, wenn die Elementbezeichner keine Konstanten sind:

      array_push($adressen[Vorname][$i] = "Christoph");
         array_push($adressen[Nachname][$i] = "Meier");
         array_push($adressen[Spitzname][$i] = "");
         array_push($adressen[Geschäft][$i] = "ja");
         array_push($adressen[Privat][$i] = "ja");
         $i += 1;

      $adressen = array();

      $adressen['Vorname']   = array();
          $adressen['Nachname']  = array();
          $adressen['Spitzname'] = array();
          $adressen['Geschäft'][ = array();
          $adressen['Privat']    = array();

      $i=0;
          $adressen['Vorname'][$i] = "Christoph";
          $adressen['Nachname'][$i] = "Meier";
          $adressen['Spitzname'][$i] = "";
          $adressen['Geschäft'][$i] = "ja";
          $adressen['Privat'][$i] = "ja";

      $i++;
          $adressen['Vorname'][$i] = "Paula";
          $adressen['Nachname'][$i] = "Müller";
          $adressen['Spitzname'][$i] = "Paulimüll";
          $adressen['Geschäft'][$i] = "nein";
          $adressen['Privat'][$i] = "ja";

      reicht da vollkommen.

      Die Elementbezeichner müssen als Strings angegeben werden, also in Häkchen stehen. Anderenenfalls würde PHP erst einmal nach einer Konstante mit desem Namen suchen und erst, wenn diese nicht gefunden wurde (leider) automatisch annehmen, dass es wohl doch ein String ist. Das führt irgendwann imemr zu schweren Fehlern, meistens im Sicherheitsbereich.

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
      Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
      1. Hi,

        danke, habe mir beides zu Herzen genommen. Die Elementbezeichner sind nun Strings und das array_push habe ich weggelassen (steht ja so auch auf http://de.php.net/manual/de/function.array-push.php).

        Grüße,
        Chris

        1. Hello,

          danke, habe mir beides zu Herzen genommen. Die Elementbezeichner sind nun Strings und das array_push habe ich weggelassen (steht ja so auch auf http://de.php.net/manual/de/function.array-push.php).

          Du hast das implizite "Array_Push" mit den [] benutzt. Da wird immer entweder ein Element hinten an die Kette angehängt, oder wenn der Index schon vorhanden ist, das Element mit diesem Index überschrieben/ausgetauscht.

          Liebe Grüße aus dem schönen Oberharz

          Tom vom Berg

          --
          Nur selber lernen macht schlau
          http://bergpost.annerschbarrich.de
          1. Hello,

            irgendwo im Archiv verstecken sich auch die Funktionen:

            delete ($_heap, $index);               ## löscht alle korresponierenden Einträge zun Index,
                                                     ## also quasi einen ganzen Datensatz

            delete ($_heap, $colname, $value);     ## löscht alle korresponierenden Einträge
                                                     ## im Haufen, deren Spalte $colname den Wert $value enthält

            replace($_heap, $index, $_record);     ## tauscht alle korrespondierenden Einträge zum Index
                                                     ## aus oder hängt ein neues Element an, wenn der
                                                     ## Index nicht vorhanden war

            append ($_heap, $_record);             ## Hängt ein neues Elment an und liefert den neuen
                                                     ## index zurück
              view   ($_heap[, $index]);             ## liefert entweder den Record als Array zurück, dessen
                                                     ## passen, oder das gesamte Array in der
                                                     ## Zeilenstruktur,

            view_sorted($_heap, $colname);         ## liefert das Array in Zeilenstruktur sortiert
                                                     ## (z.B. natsort) nach der genannten Spalte zurück

            ich hatte das hier mal ausführlich gepostet. Die Funktionen hießen aber wohl anders, sonst hätte ich das Posting gefunden. Ich habe sie leider auch nicht auf meinem Rechner :-(

            Einen Hinweis, wie dies als Universalfunktionen funktioniert, habe ich aber noch gefunden:

            http://forum.de.selfhtml.org/archiv/2005/3/t102531/#m631341

            Liebe Grüße aus dem schönen Oberharz

            Tom vom Berg

            --
            Nur selber lernen macht schlau
            http://bergpost.annerschbarrich.de