Chrisi: Rekursive Baumstruktur auslesen

Hallo zusammen,

Ich habe in meiner Datenbank Daten in Form einer Baumstruktur abgelegt, verbunden durch die ElternID.

Nun möchte ich beginnend von einer Kategorie ID alle anderen Kategoreien die unter der übergebenen Kategorie sitzen anhand der ElternID ermitteln :)

Dazu hier meine rekursive Funkion:

function baumstruktur ($CAT,$result=array()){
echo $CAT; // Zum Testen
    $row=$this->db_fetcharray($this->db_query("SELECT name,EID,KID FROM eg_okat WHERE KID = ".$CAT." LIMIT 1"));
    if($row["EID"]!=0){echo "a";
      $result[$CAT] = $row["name"];
      $this->baumstruktur($row["EID"],$result);
    }elseif($row["EID"]==0){echo "b";
      $result[$CAT] = $row["name"];
    }
    return $result;

}

Das gute Stück funktioniert sogar, nur überschreibt er mit immer wieder mein array "$result" mit den neuen Daten die er ermittelt, er soll aber natürlich die Daten festhalten.

Hat hier jemand einen Tipp für mich ?

Viele Grüße und danke, Chrisi ...

  1. Hallo,

    1.
    es ist mir immer wieder schleierhaft, wie man sich durch so schlampig formatierten Quelltext überhaupt durchfindet, und warum Programmierer sich (und übrigens auch dem Forum) sowas antun.

    2.
    für eine Baumstruktur fehlt mir da irgendwie eine Schleife. Wie liest Du denn mehrere Elemente auf gleicher Hierarchieebene aus?

    3.
    Du gibts immer nur $result[$CAT] zurück, trägst es aber nirgends ein. Wo soll sich denn da was sammeln?

    Gruß, Andreas

    --
    SELFFORUM - hier werden Sie geholfen,
    auch in Fragen zu richtiges Deutsch
    1. Ja Hallo auch,

      für eine Baumstruktur fehlt mir da irgendwie eine Schleife. Wie liest Du denn mehrere Elemente auf gleicher Hierarchieebene aus?

      Dient hier lediglich der Durchschaubarkeit für mich und gern auch für dich.

      Du gibts immer nur $result[$CAT] zurück, trägst es aber nirgends ein. Wo soll sich denn da was sammeln?

      Füttern: $result[KATID]=WERT; wobei hier KATID=$CAT die eindeutige ID ist, die dem WERT=Namen der Kategorie gehört. Das ganze passiert in der if/else Abfrage.

      Der Array sollte dann meiner Theorie nach so ausschauen:

      $result{
        40    =>  PHP,
        33    =>  CSS,
        28    =>  JAVA
      }

      Ausgeben: return $result; hier gebe ich den zuvor gefüllten array $result aus. Das passiert unten am Fuss/Ende der Funktion, jenseits von if/else. Und soll nur dann passieren wenn if nicht zugeschlagen hat, was auch prima klappt.

      Grüße, Chrisi ...

      1. Dient hier lediglich der Durchschaubarkeit für mich und gern auch für dich.

        Wenn Du es wirklich auf Durchschaubarkeit anlegen würdest, hättest Du Dir wenigstens beim zweiten Posting die kleine Mühe gemacht, Deinen Quelltext zu formatieren.

        function baumstruktur ($CAT,$result=array())
        {
            //holt die Zeile als Array
            $row=$this->db_fetcharray($this->db_query("SELECT name,EID,KID FROM eg_okat WHERE KID = ".$CAT." LIMIT 1"));

        if($row["EID"]!=0)
            {
                //name in z.B. $result[40] speichern
                $result[$CAT] = $row["name"];
                //wenn EID!=0 vorhanden: funktion aufrufen, teils gefülltes $result übergeben - SONST NICHTS!
                $this->baumstruktur($row["EID"],$result);    <--------- dort ----------+
            }                                                                          |
            elseif($row["EID"]==0)                                                     |
            {                                                                          |
                //wieso kommt die Zuweisung hier zum zweiten Mal? - sehr schlecht      |
                //merke: schlampig formatierter Queltext ist nunmal SCHLAMPEREI!       |
                $result[$CAT] = $row["name"];                                          |
            }                                                                          |
            //gefülltes $result zurückgeben, ----------------- landet -----------------+
            //auf nächst höherer Stufe nächst 'ärmeres' $result zurückgeben usw.
            //am Schluß gibt die Funktion das $result aus dem _ersten_ Aufruf zurück
            return $result;
        }

        Der Array sollte dann meiner Theorie nach so ausschauen:

        $result{
          40    =>  PHP,
          33    =>  CSS,
          28    =>  JAVA
        }

        nach meiner Theorie sieht es etwa so aus:
        $result
        {
           40 => PHP
        }

        Ausgeben: return $result;

        was ist daran denn ausgeben? Du möchtest Dich vielleicht mit dem Unterschied zwischen return und echo vertraut machen.

        Gruß, Andreas

        --
        SELFFORUM - hier werden Sie geholfen,
        auch in Fragen zu richtiges Deutsch
  2. Hallo zusammen,

    Ich habe in meiner Datenbank Daten in Form einer Baumstruktur abgelegt, verbunden durch die ElternID.

    Nun möchte ich beginnend von einer Kategorie ID alle anderen Kategoreien die unter der übergebenen Kategorie sitzen anhand der ElternID ermitteln :)

    Dazu hier meine rekursive Funkion:

    es gibt einen unterschied zwischen
    function baumstruktur
    und
    function &baumstruktur
    bitte ansehen !!

    function baumstruktur ($CAT,$result=array()){
    echo $CAT; // Zum Testen
        $row=$this->db_fetcharray($this->db_query("SELECT name,EID,KID FROM eg_okat WHERE KID = ".$CAT." LIMIT 1"));
        if($row["EID"]!=0){echo "a";
          $result[$CAT] = $row["name"];
          $this->baumstruktur($row["EID"],$result);

    hier wird eine kopie von $result übergeben ! (call by value)
    es muß aber das original &$result übergeben werden (call by reference)

    wo wandert die rückgabe hin ???

    }elseif($row["EID"]==0){echo "b";
          $result[$CAT] = $row["name"];
        }
        return $result;

    hier wird $result zurückgegeben aber im aufruf nicht beachtet !

    }

    Das gute Stück funktioniert sogar, nur überschreibt er mit immer wieder mein array "$result" mit den neuen Daten die er ermittelt, er soll aber natürlich die Daten festhalten.

    Hat hier jemand einen Tipp für mich ?

    Viele Grüße und danke, Chrisi ...

    1. Hallo,

      es gibt einen unterschied zwischen
      function baumstruktur
      und
      function &baumstruktur
      bitte ansehen !!

      Danke, hier lag auch mein Fehler, ich habe auf den Array bei erneutem rekursiven Aufruf eine Referenz gelegt, so dass mir dort die Informationen der Variable nicht verloren gehen bzw. überschrieben werden, somit muss ich hier auch nicht die Ausgabe extra Abfangen, die hole ich mir erst wenn der Baum ganz durch ist.

      Grüße, Chrisi ...