Baumstruktur ausgeben

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • 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]

    Comment


    • #3
      Nested Sets ? Wikipedia

      Comment


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

        Comment


        • #5
          Originally posted by AmicaNoctis View Post
          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

          Originally posted by h3ll View Post
          Danke für den sinnfreien Beitrag!
          Originally posted by Besth View Post
          (stichwort: nested sets) nur ist mir alles andere zu kompliziert für meinen kleinen anwendungsfall.
          Mess with the Besth, die like the rest!

          Comment


          • #6
            Originally posted by Besth View Post
            ich dachte es gibt da etwas einfaches was man genau für solche sachen nimmt
            Ja, Nested Sets.

            Comment


            • #7
              Originally posted by Besth View Post
              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.
              Last edited by AmicaNoctis; 04-07-2011, 12: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]

              Comment


              • #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!

                Comment


                • #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]

                  Comment


                  • #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!

                    Comment


                    • #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); 
                      Last edited by Besth; 04-07-2011, 15:27.
                      Mess with the Besth, die like the rest!

                      Comment


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

                        Comment


                        • #13
                          Originally posted by h3ll View Post
                          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!

                          Comment


                          • #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!

                            Comment


                            • #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!

                              Comment

                              Working...
                              X