Array rekursiv auslesen

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

  • Array rekursiv auslesen

    Hi!

    Hab schon gesucht danach, auch bisschen was gefunden, werde aber nicht wirklich schlau daraus.

    Ich seh mir grad Rekursivität etwas näher an und probiere an folgender (Basis-) Lösung herum, habe auch einen Denkansatz, allerdings fehlt mir der Denkanstoß für die Umsetzung:

    2-dimensionales Array:
    PHP-Code:
    $foo['parent']['id'
    parent gibt das übergeordnete Element an, id die eindeutige id des Elements, das Array erhält eine Bezeichnung ($foo[parent][id]=bezeichnung).

    Das Problem:
    alle Elemente (Bezeichnungen) in Baumstruktur ausgeben, also
    PHP-Code:
    element
    --element
    --element
    ----element
    --element 
    Mein Denkansatz:
    Jedes Arrayelement muss demjenigen Element untergeordnet werden, wo seine id als parent drin steht.

    Mein Testarray:
    PHP-Code:
    $array[0][1] = studio;
    $array[1][2] = yamaha 01v;
    $array[1][3] = EWS64;
    $array[1][4] = Waldorf Micro Q;
    $array[1][5] = Sirius;
    $array[3][7] = Outboard;
    $array[3][8] = SPDIF;
    $array[5][6] = Sirius Mikrofon;
    $array[7][9] = Stecker
    Mein Quellcode:
    PHP-Code:
    function echotree($start$ebene)
    {
        foreach (
    $start as $key => $value)
        {
            if(
    $key == 0)        // Erste Ebene - root
                
    $ebene == 0;
                        
            if(
    is_array($value))        
            {
                
    $ebene++;
                
    echotree($value$ebene);
            }
            else
            {
                for(
    $i 0$i $ebene$i++)    // Einrücken
                    
    echo "-";
                echo 
    $value."<br>";    // Beschreibung anzeigen
            
    }
        }
    }

    echotree($array,0
    ...bringt folgende Ausgabe:
    PHP-Code:
    studio
    -yamaha 01v
    -EWS64
    -Waldorf Micro Q
    -Sirius
    --Outboard
    --SPDIF
    ---Sirius Mikrofon
    ----Stecker 
    ...sollte aber Folgendes ausgeben:
    PHP-Code:
    studio
    -yamaha 01v
    -EWS64
    --Outboard
    ----Stecker
    --SPDIF
    -Waldorf Micro Q
    -Sirius
    --Sirius Mikrofon 
    ...was mach ich falsch?

    Danke für eure Anregungen!

    lG, bernie

  • #2
    wird jetzt nichts mit dem problem haben, aber was soll
    PHP-Code:
    if($key == 0)        
    $ebene == 0// <--- 
    bewirken?

    Kommentar


    • #3
      Hi!

      Na ja, $ebene gibt an, wieviele "-" Zeichen ich einrücke. Wenn $key (also parent) 0 ist, bin ich in der ersten Ebene (im root) und da soll nicht eingerückt werden.
      Oh...uups, ich glaub ich weiß, was du gemeint hast...natürlich muss es
      PHP-Code:
      $ebene 0
      heißen!

      Ich denke, das Problem bei meiner Funktion liegt darin, dass das Array nach seinen Keys sortiert abgearbeitet wird und ich demnach nicht erkennen kann, wenn z.B. das 4. Element ein Child des 1. Elements ist....die Funktion müsste sich quasi von parent zu id solange durchangeln (vergleichen), bis nichts mehr gefunden wird und das für jedes Element, dessen parent 0 ist....oder nein eigentlich für jedes Element
      Stimmts?

      lG
      Bernie
      Zuletzt geändert von deltacon; 26.07.2005, 18:05.

      Kommentar


      • #4
        Deine Datenstruktur (Array) spiegelt die Baumstuktur überhaupt nicht wieder, das wird also mindestens schwer, wenn nicht sogar unmöglich.

        So würde es gehen:
        PHP-Code:
        <?php
        $deine_welt 
        = array(
            
        'studio' => array(
                
        'yamaha 01v',
                
        'EWS64' => array(
                    
        'Outboard' => array(
                        
        'Stecker'),
                    
        'SPDIF'),
                
        'Waldorf Micro Q',
                
        'Sirius' => array(
                    
        'Sirius Mikrofon')
            )
        );

        function 
        tree($start$ebene 0) {
            foreach (
        $start as $key => $value) {
                if(
        is_array($value)) {
                    for(
        $i 0$i $ebene$i++) $out .= "--";
                    
        $out .= "$key\n".tree($value$ebene+1);
                } else {
                    for(
        $i 0$i $ebene$i++) $out .= "--";
                    
        $out .= "$value\n";
                }
            }
            return 
        $out;
        }

        echo 
        '<pre>'.tree($deine_welt).'</pre>';
        ?>

        Kommentar


        • #5
          Hi!

          Danke für deine Antwort!
          Hmm, verstehe, was du meinst. Das Array sollte also quasi die Baumstruktur schon wiederspiegeln (mit entsprechend hoher Dimension - z.B. 5. Unterelement ist 5-dimensional)?!

          Geh mal wieder dran basteln...

          lG
          bernie

          Kommentar


          • #6
            Wenn das Array die Struktur schon widerspiegelt, macht die Rekursion nicht so viel Sinn oder?

            Wie wäre es hiermit?

            PHP-Code:
            $sarray[1] = array("Opa",0);
            $sarray[2] = array("Mutter",1);
            $sarray[3] = array("Tante Erna",1);
            $sarray[4] = array("Tante Heike",1);
            $sarray[5] = array("Onkel Franz",1);
            $sarray[6] = array("Horst (Sohn von Erna)",3);
            $sarray[7] = array("Ich",2);
            $sarray[8] = array("Neffe1 (Sohn von Franz)",5);
            $sarray[9] = array("Mein Kind",7);
            $sarray[10] = array("Mein Enkelkind-Kind",11);
            $sarray[11] = array("Mein Enkelkind",9);
            $sarray[12] = array("Tante Louise",1);
            $sarray[13] = array("Neffe2 (auch Sohn von Franz)",5);
            $sarray[14] = array("irgendwie verwandt mit Neffe1",8);

            //print_r($sarray);

            function echotree($start$ebene$tiefe){
                
            $tiefe++;
                foreach (
            $start as $key => $value) {
                   if(
            $value[1]==$ebene){
                           for(
            $i 0$i $tiefe$i++){
                            echo 
            "-";
                        }
                        echo 
            $value[0]."<br>";
                    }
                    if(
            $value[1]==$ebene){
                        
            echotree($start,$key,$tiefe);
                    }
                }
            }

            echotree($sarray,0,-1); 
            ergibt:

            Opa
            -Mutter
            --Ich
            ---Mein Kind
            ----Mein Enkelkind
            -----Mein Enkelkind-Kind
            -Tante Erna
            --Horst (Sohn von Erna)
            -Tante Heike
            -Onkel Franz
            --Neffe1 (Sohn von Franz)
            ---irgendwie verwandt mit Neffe1
            --Neffe2 (auch Sohn von Franz)
            -Tante Louise

            Kommentar


            • #7
              Wenn das Array die Struktur schon widerspiegelt, macht die Rekursion nicht so viel Sinn oder?
              Yep, korrektamente. Drum ist diese Lösung nicht so elegant.

              Deine Lösung bringt das richtige Ergebnis! Sehr cool! Genial einfach!
              Eine kleine Anmerkung / Frage: warum machst du 2x die if-Abfrage? Ginge das nicht auch so:
              PHP-Code:
              function echotree($start$ebene$tiefe){
                  
              $tiefe++;
                  foreach (
              $start as $key => $value) {
                     if(
              $value[1]==$ebene){
                             for(
              $i 0$i $tiefe$i++){
                              echo 
              "-";
                          }
                          echo 
              $value[0]."<br>";
                           
              echotree($start,$key,$tiefe);
                   }

              ?

              Ich arbeite gerade an einer Lösung, die jeden Zweig durchläuft und jedes Element, das ausgegeben wurde (also am Ende des Zweigs steht), aus dem Hauptarray löscht. Somit wird die Abarbeitung immer schnelller, bis schließlich nur mehr ein Element über ist (nämlich das aus Ebene 0).
              Ist komplexer, aber ich denke, bei großen Datenmengen schneller.

              lG
              Bernie
              Zuletzt geändert von deltacon; 28.07.2005, 13:46.

              Kommentar


              • #8
                Die doppelte if-Abfrage ist tatsächlich Blödsinn.
                Entstand durch reine Rumprobiererei, was denn eigentlich wie abgefragt werden müsste, bis das Richtige angezeigt wurde ;-)

                ...und plötzlich war es doppelt drin...

                Mit dem Löschen von Teilen des Arrays, während es rekursiv ausgelesen wird, hätte ich auf den ersten Blick ein seltsames Gefühl, aber könnte klappen!

                Wenn Du eine Lösung hast, stell mal rein!

                Schöne Grüße
                Carlo

                Kommentar

                Lädt...
                X