PHP: Problem mit Baumstruktur



  • Also ich versuche eine Baumstruktur mit php zu machen, ich hab jetzt das hier:

    function tree($who,$ebene=0) 
    { 
        global $db,$n; 
        $result = $db->query("SELECT * FROM portal_info",__FILE__,__LINE__); 
        for($x=0;$x<$db->num_rows($result);$x++) 
        { 
            $row = $db->fetch_array($result); 
            if($row['zugruppe'] == $who){ 
                for($x=0;$x<$ebene;$x++) 
                { 
                $ausgabe .= "&nbsp;"; 
                } 
                if($row['gruppe'] == "gruppe"){ 
                    $ausgabe .= "<font size=5>".$row['name']."</font><br>"; 
                }elseif($row['gruppe'] == "sub_gruppe"){ 
                    $ausgabe .= "<font size=4>".$row['name']."</font><br>"; 
                }elseif($row['gruppe'] == "link"){ 
                    $ausgabe .= "<font size=3>".$row['name']."</font><br>"; 
                } 
                $ausgabe .= tree($row['id'],+5); 
            } 
        } 
    
        return $ausgabe; 
    } 
    
    echo tree("0");
    

    Und meine MySQL Tabelle sieht so aus:

    -------------------------------------- 
     id | name | gruppe | zugruppe 
    --------------------------------------
    

    Mit folgenden einträgen:

    ------------------------------------- 
     1 | Klassen | gruppe | 0 
     2 | MySQL datenbanken | gruppe | 0 
     3 | Functions | sub_gruppe | 1 
     4 | Templates | sub_gruppe | 1 
    -------------------------------------
    

    Eigentlich soll die ausgebe dann so aussehen:

    Klassen 
      Functions 
      Templates 
    MySQL datenbanken
    

    Aber die ausgabe sieht so aus:

    Klassen 
      Functions 
    MySQL datenbanken
    


  • Ist ja auch kein Wunder, wenn du die Datenbank einfach nur von oben nach unten durchratterst... Du musst die Datensätze sortieren, sodass zuerst die Obergruppe zu sehen ist, und dann deren Untergruppen, und unter jeder Untergruppe die dazugehörigen Links. So gibt er es "willkürlich" aus und die Ausgabe ergibt nachher keinen Sinn. Aber Menüs... naja, da braucht man eigentlich keine Datenbank finde ich, das löse ich immer mit einfachen Textdateien, aus 2 Gründen:

    - Ich kann sie jederzeit sehr einfach und schnell editieren
    - Ich habe eine genaue Übersicht und muss nicht erst sortieren.

    Dazu nehm ich immer eine Textdatei, z.B. cat.txt:

    Menu|Links|Sonstiges
    

    Und dann mit dem jeweiligen Namen eine Textdatei, also z.B. menu.txt:

    seite1.htm|Seite1|
    seite2.htm|Seite2|
    ...
    

    Und schließlich die Menüseite, z.B. menu.php:

    <?php
    
    // Kategorien einlesen
    $cat=explode("|",file("cat.txt"));
    
    // Kategorien nach Namen sortieren
    sort($cat);
    
    for($i=0;$i<count($cat);++$i)
    {
      // Jede Kategorie ausgeben
      echo "<font size=\"5\">".$cat."</font><br>";
    
      // Links einlesen
      $links=file(strtolower($cat[$i]));
    
      for($j=0;$j<count($links);++$j)
      {
        // URL und Caption auslesen
        list($url,$caption)=split('[|]',$links[$j]);
    
        // Als Menüpunkt ausgeben
        echo "<a href=\"".$url."\"><font size=\"3\">".$caption."</font></a><br>";
      }
    }
    ?>
    

    Einziger Nachteil: Kategorienamen dürfen keine Sonderzeichen enthalten...

    Nunja, diesen Script kann ich grad net testen, aber es müsste so laufen.



  • Um dein Problem per MySQL zu lösen, bieten sich dir im Prinzip zwei Möglichkeiten:

    1.) Du speicherst die Einträge genau in der Reihenfolge in der Datenbank, in der sie am Ende auch ausgegeben werden sollen (evtl. auch über ein zusätzliches Feld in der DB und einem 'ORDER BY' im Query). Dann entfällt die 'zugruppe' Eigenschaft, da die Zugehörigkeit festgelegt ist.

    2.) Du gibst den Gruppen denselben 'zugruppe' Wert wie den zugehörigen Untermenüeinträgen. Dann sortierst du im Query primär nach 'zugruppe' und sekundär nach 'id' oder so.

    3.) Zwei ineinander verschachtelte Queries. Das erste liest alle Gruppen aus und das zweite innerhalb einer Gruppe alle Menüeinträge.


Log in to reply