Baumstruktur anzeigen

ThoRr

Mitglied
Hi!
Ich habe in meinen Seiten eine Baumstruktur mit unendlich möglichen untergeordneten Seiten. Die übergeordnete Seite ist als ID in der Spalte parent gespeichert.
Aber wie realisiere ich, dass auch alle Elemente untergeordnet den richtigen Elementen angezeigt werden? Ich kann es unmöglich mit if()-Abfragen machen, da es ja unendlich viele untergeordnete Seiten geben kann. Also muss irgendwie eine while-Konstruktion her. Aber wie? Die übergeordnete Liste muss ja auch irgendwie an der richtigen Stelle weitergeführt werden.
Ich hoffe, ihr könnt mir helfen! Ich habe mit tagelang den Kopf darüber zerbrochen - erfolglos.
LG Torben
 
Wikipedia: Rekursion

Und hier eine Beispiel Funktion anhand der Fakultätsrechnung

PHP:
<?php
function fakultaet($n)
{
  if($n <= 1)
  {
    return 1;
  }
  else
  {
    return ( $n * fakultaet($n - 1) );
  }
}

$var = fakultaet(4);

print $var;
?>
 
Hier haste den fertigen Code für so einen Baumstruktur ist eine rekustive.

PHP:
function baum($vater,$lpos) #vater welches menu wird gezeigt ; in lpos wird meine liste aufgebaut für den nächsten klick 
{ 
    global $link;  # Der Link zur DB durch global auch in der Funktion bekannt. 
    global $wahl;  # hier sind als Array die ids drin die aufgeklappt sind (kommt aus der var pos) 
    static $ebene = 0; # mit static erstelle ich eine Variable, die beim erneuten 
                        # Aufruf der Funktion den Wert aus der Vorgängerfunktion behält. 
                        # Die ist wichtig für die Rekursion. Der Startwert ist 0 und der 
                        # wird hochgezählt beim Neuaufruf. Wenn ich also im Menu bei Apfel bin, 
                        # ist der Wert bei 1. 

    $erg[$ebene] = mysql_query("SELECT * FROM `kategorie` WHERE On_off='j' and `Parent` = '$vater'order by K_sort",$link); 
    $menge = mysql_num_rows($erg[$ebene]); 
    # Das ist auch noch klar. Lese das aktuelle Menu aus der Datenbank aus und starte eine Schleife ... 
    for ($lo=0;$lo<$menge;$lo++) { 
        $row = mysql_fetch_row($erg[$ebene]);    # Den Menu Eintrag auslesen, in $row[1] == Kname
                                               # ist ja der menueintrag als text .. 
        $menu = "<a href=\"index.php?pos=".$lpos."|".$row[0]."&amp;".strip_tags(SID)."\">".$row[1]."</a><br>"; 
        # Hier bastel ich den Link zusammen. Am schwersten zu verstehen ist wohl 
        # pos=$lpos|$row[0], ich werde noch näher darauf eingehen. 

        if ($ebene > 0) {    # Hier rücke ich einfach nur ein, je tiefer ich im Menu(Rekursion) 
                            # bin, umso mehr Leerzeichen vorne dran 
            echo str_repeat("&nbsp;&nbsp;",$ebene);  //$ebene ist anzahl der wiederholungen des Sring (&rArr;)
        		echo ("<img src=style/menu.GIF width=15 height=14 class=back >");
        } 
       
        echo $menu; 
        if ($row[0] == $wahl[$ebene+1]) { # Hier folgt der Aufruf der Funktion (ab in die Rekursion) 
            $ebene++; # ein Level hoch 
            baum($row[0],$lpos."|$row[0]"); 
            $ebene--; # und wieder ein Level runter 
        } 
    } 
} 
// Strings entwerten
$wahl=mysql_escape_string($_GET['pos']);
//echo $wahl;
$wahl = explode("|",$wahl); # aus meiner pos mache ich ein array wahl - wahl[1] hat inhalt 1 

baum(0,""); # starte die Funktion, liste alles auf was als vater 0 hat 
$pos=mysql_escape_string($_GET['pos']); #Get dem anderen link zwischen speichern
//var_dump($wahl[1]);
if (sizeof($wahl) > 0) { # nur wenn wahl vorhanden ist 
    $id = $wahl[sizeof($wahl)-1]; # den letzten Eintrag von wahl ermitteln 
    # was anzuzeigen ist, aus db holen 
    $erg = mysql_query("SELECT `Kname` FROM `kategorie` WHERE `Kat_id`='$id'",$link) or die(mysql_error()); 
    $row = mysql_fetch_row($erg); 
    if ($row[0] != "") { # wenn ein Eintrag vorhanden ist, per javascript aufrufen 
   
 } 
}

Mfg Splasch
 
danke! ich kann mich jetz iwie nicht entscheiden, welche variante ich nehmen soll. ich möchte auch seiten nach oben und unten verschieben können, und das wird dann ja etwas kompliziert^^
 
Zurück