Ankündigung

Einklappen
Keine Ankündigung bisher.

Nested Sets in PHP verarbeiten

Einklappen

Neue Werbung 2019

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

  • Nested Sets in PHP verarbeiten

    Hi erstmal,

    vor einiger Zeit hatte ich mal hier den Tipp bekommen, bei Baumstrukturen am besten Nested Sets zu verwenden, wenn diese nicht ständig verändert wird. Daraufhin habe ich mir Nested Sets durchgelesen und es damals auch verstanden (dachte ich zumindest).

    Soweit vorweg das Speichern, Aktualisieren und Löschen funktioniert wunderbar. Nun will ich die Daten aber auslesen und in eine Listenstruktur einbauen

    PHP-Code:
    <ul>
        <
    li>Main 1</li>
        <
    li>Main 2
            
    <ul>
                <
    li>Sub 2.1
                    
    <ul>
                        <
    li>SubSub 2.1.1</li>
                        <
    li>SubSub 2.1.2</li>
                    </
    ul>
                </
    li>
                <
    li>Sub 2.2</li>
            </
    ul>
        </
    li>
        <
    li>Main 3</li>
    </
    ul
    Ich hole mir die Daten in ein Array das so aussieht:
    PHP-Code:
    Array
    (
        [
    0] => List Object
            
    (
                [
    name] => Main 1
                
    [lft] => 1
                
    [rgt] => 2
                
    [level] => 0
                
    [offspring] => 0
            
    )

        [
    1] => List Object
            
    (
                [
    name] => Main 2
                
    [lft] => 3
                
    [rgt] => 12
                
    [level] => 0
                
    [offspring] => 4
            
    )

        [
    1] => List Object
            
    (
                [
    name] => Sub 2.1
                
    [lft] => 4
                
    [rgt] => 9
                
    [level] => 1
                
    [offspring] => 2
            
    )

        [
    1] => List Object
            
    (
                [
    name] => SubSub 2.1.1
                
    [lft] => 5
                
    [rgt] => 6
                
    [level] => 2
                
    [offspring] => 0
            
    )

        [
    1] => List Object
            
    (
                [
    name] => SubSub 2.1.2
                
    [lft] => 7
                
    [rgt] => 8
                
    [level] => 2
                
    [offspring] => 0
            
    )

        [
    1] => List Object
            
    (
                [
    name] => Sub 2.2
                
    [lft] => 10
                
    [rgt] => 11
                
    [level] => 1
                
    [offspring] => 0
            
    )

        [
    1] => List Object
            
    (
                [
    name] => Main 3
                
    [lft] => 13
                
    [rgt] => 14
                
    [level] => 0
                
    [offspring] => 0
            
    )

    Wie gesagt überlege ich seit ca. gestern Mittag, wie ich das jetzt auslesen und vernünftig darstellen kann. Muss ich dass Array erst verschachteln? oder kann ich es sofort verarbeiten?

    Nur der formhalber: Mir ist auch eine Lösung eingefallen, indem ich darauß ein verschachteltes Array mache, dass ich dann durch eine rekursive funktion jage. Würde denke ich (Theorie) auch funktionieren, allerdings finde ich diese Lösung eben nicht so geschickt und wollte mal Wissen ob es andere Wege gibt Nested Sets auszulesen.

    Ich bin mir zwar sicher dass dieses Thema dem Inserate und Meinungsumfragen Schema entspricht, hoffe aber dennoch dass es nicht im Müll landet.


  • #2
    Wieso machst du dir solche umstände?
    Das geht doch ganz einfach mit einer MYSQL-Query
    PHP-Code:
    SELECT t1.name AS ebene1t2.name as ebene2t3.name as ebene3t4.name as ebene4t5.name as ebene5
    FROM documents_folder t1
    LEFT JOIN documents_folder t2 ON t2
    .parent_id t1.id
    LEFT JOIN documents_folder t3 ON t3
    .parent_id t2.id
    LEFT JOIN documents_folder t4 ON t4
    .parent_id t3.id
    LEFT JOIN documents_folder t5 ON t5
    .parent_id t4.id
    WHERE t1
    .parent_id 0
    so kannst du das alles ziemlich geschickt auslesen

    Kommentar


    • #3
      Danke, aber wie schon gesagt verwende ich nested Sets und nicht das parant-children Prinzip. Der Nachteil an der parant-children geschichte ist dass du dein Statement nur begrenzt vorbereiten kannst, wohingegen du mit nested Sets undendlich viele ebenen mit dem selben Statement abfragen kannst.

      Jetzt habe ich auch eine Lösung gefunden:
      PHP-Code:
      $lastLevel = -1;
      $html '';
      foreach(
      $listObjects as $listObject) {
          
      $level $listObject->level;
          if(
      $level $lastLevel) {
              
      $html .= '<ul>';
          } else if(
      $level $lastLevel) {
              for(
      $i $lastLevel$i $level$i--) {
                  
      $html .= '</li>';
                  
      $html .= '</ul>';
              }
          } else {
              
      $html .= '</li>';
          }
          
      $html .= '<li>';
          
      $html .= $listObject->name;
          
      $lastLevel $level;
      }
      print 
      $html .= '</ul>'
      Währe schön wenn ein Mod das Thema jetzt noch zu Anfänder verschieben könnte da es garantiert auch dorthin gehört.

      Kommentar


      • #4
        [MOD: verschoben]
        --

        „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
        Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


        --

        Kommentar


        • #5
          Ich muss mich jetzt doch nochmal an euch wenden

          Seit 3 Tagen versuche ich mittel und wege zu finden wie ich das ganze Nutzerfreundlich im ACP anbieten kann. Die momentan beste Lösung die ich gefunden habe ist mit dem JQuery Plugin NestedSortable Widget (demo). Leider ist dieses veraltet und mit der neuen Version 1.4.2 nicht mehr kompatibel.

          Daher bin ich zurück zum Anfang und hab mir wieder Gedanken darüber gemacht, wie man dass mit Formularen lösen kann. Leider finde ich da keine Ordentliche Lösung. Die einzige die mir dazu eingefallen ist währe ein Tunnel in dem zuerst das Elternelement abgefragt und danach die Position an der es einsortiert werden werden soll.

          Leider finde ich das auch nicht wirklich nutzerfreundlich, daher meine Bitte, ob mir jemand noch alternativen aufzeigen kann.

          Kommentar

          Lädt...
          X