Baumstruktur ausgeben

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

  • Baumstruktur ausgeben

    Hallo,
    ich habe eine Baumstruktur in meiner DB gespeichert und möchte die nun ausgeben. Nur leider scheitert es grad genau hier bei mir.
    So soll es am Ende aussehen:
    Code:
    - Vorgang1
    --- Vorgang2
    --- Vorgang3
    ----- Vorgang4
    ----- Vorgang5
    --- Vorgang6
    - Vorgang7
    --- Vorgang8
    - Vorgang9
    In meiner Datenbank habe ich immer die zuordnung zum parent gespeichert
    Code:
    id name      parent
    1  Vorgang1  0
    2  Vorgang2  1
    3  Vorgang3  1
    [...]
    9  Vorgang9  0
    Wie muss nun mein php-Code aussehen, um auch möglichst tiefe verschachtelungen auszugeben?

    bisher hab ich nur sowas, aber das kann nicht richtig sein, da müsste ich ja jede vertiefung händisch neu programmiern - da gibt es bestimmt ne einfache schleife oder sowas in der art, auf die ich nur nicht komme.

    PHP-Code:
          $sql "SELECT * FROM tabelle WHERE parent = '0'";
          
    $result db($sql);
          while(
    $row mysql_fetch_assoc($result)) {
            echo 
    $row['titel']."<br>";
            
    $sql2 "SELECT * FROM tabelle WHERE parent = '".$row['id']."'";
            
    $result2 db($sql2);
            while(
    $row2 mysql_fetch_assoc($result2)) {
    // ausgeben
            
    }
          } 
    ps: ich weiß das mein db-aufbau um eine baumstruktur abzulegen nicht optimal ist (stichwort: nested sets) nur ist mir alles andere zu kompliziert für meinen kleinen anwendungsfall.
    ich will erstmal in dieses thema "reinkommen" - eventuell mach ich mich dann später an andere lösungsmöglichkeiten.
    Mess with the Besth, die like the rest!

  • #2
    Hallo,

    nachdem du die gesamte Tabelle abgerufen und in ein Array gespeichert hast, müsstest du dieses mit einer rekursiven Funktion durchlaufen (es geht auch mit Schleifen, ist aber meist komplizierter).

    Die Daten in derselben Schleife auszugeben, in der sie abgerufen werden, ist prinzipiell auch möglich, aber nur sinnvoll, wenn die Datensätze entsprechend vorsortiert sind und auch wirklich nur für die Ausgabe benötigt werden. Dafür brauchst du aber einen Stack, der das letzte Element jeder Ebene speichert, damit du, ähnlich zum Verfahren für Gruppenwechsel, den Vergleich mit dem aktuellen Element durchführen kannst, der darüber entscheidet, ob eine Ebenenänderung (ähnlich dem Gruppenbruch) erfolgen muss.

    Gruß,

    Amica
    [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
    Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
    Super, danke!
    [/COLOR]

    Kommentar


    • #3
      Nested Sets ? Wikipedia

      Kommentar


      • #4
        Evtl ist dir dieses ja eine Hilfe: PHP: RecursiveTreeIterator - Manual
        Wir werden alle sterben

        Kommentar


        • #5
          Zitat von AmicaNoctis Beitrag anzeigen
          nachdem du die gesamte Tabelle abgerufen und in ein Array gespeichert hast, müsstest du dieses mit einer rekursiven Funktion durchlaufen (es geht auch mit Schleifen, ist aber meist komplizierter).
          Könntest du mir da noch einen Tipp geben wie das Array und die Funktion aussehen müsste?

          ich dachte es gibt da etwas einfaches was man genau für solche sachen nimmt

          Danke für den sinnfreien Beitrag!
          Zitat von Besth Beitrag anzeigen
          (stichwort: nested sets) nur ist mir alles andere zu kompliziert für meinen kleinen anwendungsfall.
          Mess with the Besth, die like the rest!

          Kommentar


          • #6
            Zitat von Besth Beitrag anzeigen
            ich dachte es gibt da etwas einfaches was man genau für solche sachen nimmt
            Ja, Nested Sets.

            Kommentar


            • #7
              Zitat von Besth Beitrag anzeigen
              Könntest du mir da noch einen Tipp geben wie das Array und die Funktion aussehen müsste?
              Da gibt es so viele Möglichkeiten. Das Array könnte einfach assoziativ über die ID als Schlüssel gehen, die Funktion hängt unmittelbar davon ab, was du am Ende mit den Daten machen willst: Sie einfach nur ausgeben oder in eine hierarchische Array/Objekt-Struktur überführen?

              Man kann auch bereits in der while-Schleife eine hierarchische Struktur aufbauen, entweder mit Objekten oder mit Arrays und Referenzen.

              Edit: Thema Nested Sets. Die Hartnäckigkeit von h3ll ist berechtigt, immerhin lässt sich deine DB-Struktur einfach um eine lft- und rgt-Spalte ergänzen, so dass du (unter Aufgabe eines Normalisierungskriteriums) den bisherigen Parent-Children-Ansatz parallel zu Nested Sets fahren kannst.
              Zuletzt geändert von AmicaNoctis; 04.07.2011, 13:51.
              [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
              Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
              Super, danke!
              [/COLOR]

              Kommentar


              • #8
                nun gut - danke für den hinweis
                ich hab es jetzt so gemacht:
                db wird ausgelesen und alles in ein array gepackt
                Code:
                Array
                (
                    [1] => Array
                        (
                            [id] => 1
                            [parent] => 0
                            [titel] => test
                        )
                    [2] => Array
                        (
                            [id] => 2
                            [parent] => 0
                            [titel] => titel
                        )
                    [3] => Array
                        (
                            [id] => 3
                            [parent] => 1
                            [titel] => test2
                        )
                    [4] => Array
                        (
                            [id] => 4
                            [parent] => 3
                            [titel] => sdf
                        )
                )
                und das wird dann durch folgende funktion gejagt.
                PHP-Code:
                function list_items($ar,$parent=0){
                  echo 
                "<br>";
                  foreach(
                $ar as $key=>$value){
                    if(
                $value['parent'] == $parent){
                      echo 
                $value['titel'];
                      
                list_items($ar,$value['id']);
                    }
                  }
                }
                list_items($array); 
                das funzt auch soweit ganz gut.
                nur wie rück ich das jetzt ein
                das man erkennt was zu wem gehört - also mit listen oder von mir auch ganz einfachen strichen. nur wo muss der code dafür rein?
                ich bin da grad zu doof für - alles was ich bisher versucht hab - klappt nicht ^^
                Mess with the Besth, die like the rest!

                Kommentar


                • #9
                  Nimm einen dritten Parameter hinzu: $level = 0
                  Bei jedem rekursiven Aufruf übergibst du dafür $level + 1
                  Die Einrückung kannst du jetzt anhand von $level vornehmen, dreckiges Beispiel:

                  PHP-Code:
                  echo str_repeat("&#xa0;"$level); 
                  [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                  Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                  Super, danke!
                  [/COLOR]

                  Kommentar


                  • #10
                    Oder man verschachtelt Listen ineinander und formatiert bequem mit Css.
                    Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
                    Schön - etwas Geschichte kann ja nicht schaden.
                    Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

                    Kommentar


                    • #11
                      ah ja das ist die lösung
                      ohne das "level" kommt man nicht weiter

                      danke vielmals.
                      jetzt funktioniert es

                      PHP-Code:
                      function list_items($ar,$parent=0,$level=0){
                        echo 
                      "<br>";
                          foreach(
                      $ar as $key=>$value){
                            if(
                      $value['parent'] == $parent){
                              echo 
                      str_repeat("&nbsp;",3*$level).$value['titel'];
                              
                      list_items($ar,$value['id'],$level+1);
                            }
                          }
                        }

                        
                      list_items($array); 
                      Zuletzt geändert von Besth; 04.07.2011, 16:27.
                      Mess with the Besth, die like the rest!

                      Kommentar


                      • #12
                        Warum erstellst du keine richtige Liste, wenn du schon eine Liste ausgibst?

                        Kommentar


                        • #13
                          Zitat von h3ll Beitrag anzeigen
                          Warum erstellst du keine richtige Liste, wenn du schon eine Liste ausgibst?
                          Die Best(h)en, der Besten, der Besten kommen halt ohne so einen unnützen Kram wie semantisches Markup aus.
                          Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

                          Kommentar


                          • #14
                            darum gehts doch garnicht
                            das mein code am ende nicht so aussehen wird, sollte klar sein
                            aber zu testzwecken und um mein problem darzulegen fand ich es passend.

                            aber schön das ihr auch mal euren senf abgelassen habt. ich denke ich habe mein anliegen gut geschildert und habe auch geschrieben was ich schon unternommen habe und was ich nicht möchte. und dennoch kommen dann so sinnlose beiträge ...

                            nunja wie auch immer
                            Ich danke noch einmal AmicaNoctis für die konstruktiven Lösungsvorschläge.
                            Das hat mir sehr weitergeholfen
                            Mess with the Besth, die like the rest!

                            Kommentar


                            • #15
                              Du hast nach einer Möglichkeit zur Einrückung gefragt und dir wurde nach der ersten Antwort eine weitere Möglichkeit genannt. Wenn du weiterhin nur den erstbesten Vorschlag brauchst, erspare ich (und wohl auch ein paar andere) es mir, dir (sinnvolle) Alternativen aufzuzeigen.
                              Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
                              Schön - etwas Geschichte kann ja nicht schaden.
                              Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

                              Kommentar

                              Lädt...
                              X