Arraybaum durchlaufen

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

  • Arraybaum durchlaufen

    Hallo!

    Neu hier, aber ein bisschen PHP programmieren hab ich schon gelernt :-| Allerdings stehe ich jetzt vor dem Problem, dass ich in einem Array zu einem gegebenen Wert alle "Vorgängerwerte" der jeweils nächsthöheren Ebenen herauskitzeln muss. Das Array schaut z.B. so aus:
    PHP-Code:
    Array
    (
        [
    1] => dfb974b9e24231948369297ba5ff6ce5
        
    [2] => Array
            (
                [
    5] => a63caba97e021bf69cb4091a6c2b44ce
                
    [6] => Array
                    (
                    )
                [
    9] => c6e1ebf22d68a828226836c6efa64c81
                
    [10] => Array
                    (
                    )
                [
    14] => e50fc57c0b0dbe58f4e5ace5e31e7213
                
    [15] => Array
                    (
                    )
            )
        [
    19] => bd0dbb6c2d7e6aae3751359215c9c326
        
    [20] => Array
            (
                [
    22] => b10723f5b0dbafefc70a71c953cb8c0e
                
    [23] => Array
                    (
                    )
            )

    Die Werte sind jeweils zur Laufzeit generierte md5-Schlüssel. Auch die Keys werden erst zur Laufzeit zugewiesen.
    Wenn ich z.B. den Wert für Key 9: [COLOR=orangered]c6e1ebf22d68a828226836c6efa64c81[/COLOR] gegeben habe, brauche ich die jeweiligen Knoten der jeweils höheren Ebene. In diesem Fall also
    - [COLOR=orangered]c6e1ebf22d68a828226836c6efa64c81[/COLOR]
    - [COLOR=darkblue]dfb974b9e24231948369297ba5ff6ce5[/COLOR]

    Das Array ist aber nicht notwendigerweise auf 2 Ebenen beschränkt, sondern kann beliebig tief gehen.

    Gibts dafür 'ne Lösung?

    Danke, Stefan
    Man strahlt hier nicht in Wien - denn bald strahlt es aus Temmelin :-|

  • #2
    Kurze Nachfrage: Willst du alle Elemente der übergeordneten Dimension oder nur die, deren Index kleiner ist?

    Auf dein Beispiel bezogen: Du hast Array[2][9] in der Hand. Die übergeordnete Dimension ist Array[x]. Möchtest du nun davon alle Elemente (alle Array[x][y], die nicht selbst wieder Arrays sind) oder nur die "kleineren" (alle Array[x][y], die nicht selbst wieder Arrays sind und für die x < 2 gilt)?

    Also möchtest du nur dfb974b9e24231948369297ba5ff6ce5 oder auch bd0dbb6c2d7e6aae3751359215c9c326?

    Kommentar


    • #3
      Danke der Nachfrage - da hab ich mich nicht ordenltich ausgedrückt:

      Ich will NUR den Weg zum Ziel, im Fall des Beispiels nur das Element ([1] =>) dfb974b9e24231948369297ba5ff6ce5 und das gegebene Element selbst.

      Bedenke aber, dass ich abgesehen vom Array und dem gegebenen Value keinerlei Informationen habe (insb. aktuelle Zeiger im Array)!

      Danke! Stefan
      Man strahlt hier nicht in Wien - denn bald strahlt es aus Temmelin :-|

      Kommentar


      • #4
        Weil du grad am Lernen bist, hier erstmal ein möglicher Ansatz - falls du es nicht ausprogrammiert bekommst, poste deinen Code und wir sehen weiter.

        Also los gehts. Wir besorgen erstmal einen Zeiger auf den gesuchten Schlüssel s. Da s beliebig tief in der Hierarchie stehen kann, bietet sich eine rekursive Funktion an.
        Diese Funktion könnte die "Index-Spur" x->y->z für Array[x][y][z] = s zurückgeben oder lieber nur den Zeiger auf Array[x] und den Wert y.

        Der Rest ist ein Kinderspiel: Mit einer Schleife gehen wir über alle Elemente von Array[x], deren Index kleiner als y ist und ziehen alle String-Elemente heraus.

        Kommentar


        • #5
          Danke für die Infos!
          Mein Gedanken-Haken war der, dass jede Ebene ihren eigenen Zeiger hat. Aber genau das rettet mich ja jetzt. Der Code so far:
          PHP-Code:
          function GetPath($sval$arr, &$res) {
            static 
          $gef false;  // true, wenn sval gefunden wurde

            
          reset($arr);          // setzt Zeiger im aktuellen Array auf den Anfang
            
          do {                  // Schleife mind. 1x durchlaufen
              
          if (is_array(current($arr))) {           // ist Knoten ein Array? Wenn ja, ...
                
          GetPath($svalcurrent($arr), $res); // ... dann nächste Ebene durchsuchen
                
          if ($gef) {       // wenn gefunden, dann im Rücklauf alle Knoten-Values dranhängen
                  
          $res .= "###".prev($arr); //Value immer eine Pos vor dem Array-Knoten
                
          //if ($gef)
              
          } else {            // Wenn kein Array, dann...
                
          if ((!$gef) && ($sval == current($arr))) { //... auf $sval prüfen
                  
          $gef true;          // wenn gefunden, $gef auf true setzen, und...
                  
          $res current($arr); // ... den Value (=$sval) ins Ergebnis schreiben
                
          }
              } 
          //if (!is_array(...
            
          } while ((!$gef) && (next($arr) !== false));
          //GetPath
              
          GetPath('c6e1ebf22d68a828226836c6efa64c81'$x$res);  // Beispielaufruf
          $path array_reverse(explode("###"$res));            // Aus dem Ergebnis ein Array extrahieren,
                                                                  // dieses umdrehen, damit aufsteigend sortiert
          echo "<pre>";print_r($path);echo "</pre>";              // Beispiel-Ausgabe
          ///////////////////////// Ausgabe:
          Array
          (
              [
          0] => dfb974b9e24231948369297ba5ff6ce5
              
          [1] => c6e1ebf22d68a828226836c6efa64c81

          Schönen Abend und THX noch mal! Stefan
          Zuletzt geändert von skrejci; 11.07.2006, 23:25.
          Man strahlt hier nicht in Wien - denn bald strahlt es aus Temmelin :-|

          Kommentar

          Lädt...
          X