mediengestalter.info
FAQ :: Mitgliederliste :: MGi Team

Willkommen auf dem Portal für Mediengestalter

Aktuelles Datum und Uhrzeit: Fr 19.04.2024 20:47 Benutzername: Passwort: Auto-Login

Thema: [PHP/MySQL] Dynamisches Menü mit Nested Sets vom 22.01.2008


Neues Thema eröffnen   Neue Antwort erstellen MGi Foren-Übersicht -> Programmierung -> [PHP/MySQL] Dynamisches Menü mit Nested Sets
Seite: Zurück  1, 2
Autor Nachricht
weltio

Dabei seit: 04.01.2011
Ort: -
Alter: -
Geschlecht: -
Verfasst Mo 01.08.2011 10:20
Titel

Antworten mit Zitat Zum Seitenanfang

pixelpapst303 hat geschrieben:
im grunde brauchst du in deinem beispiel doch "nur" jeweils das level vom aktuellen eintrag mit dem vom nächten eintrag vergleichen. in php sind da next() und current() - (arrayfunktionen) deine freunde.

wenn next dann größer current is, geht n ul auf. wenns kleiner is, ein ul zu. wenns gleich is passiert nüschts...


Nagut, dann schände ich mal diese Leiche...

Also, ich habe dasselbe Problem - ein nested set hierarchisch als Liste, geschachtelte Divs - whatever - auszugeben.

Deinen Vorschlag überprüfend bin ich zu dem Schluss gekommen: Nö.
(Klingt zwar gut, funktioniert aber nicht):

Code:

for($i=0;$i<count($data);$i++){
   $cur=$data[$i]["Level"];
   $next=($i+1)==count($data)?$data[0]["Level"]:$data[$i+1]["Level"];
   $id=$data[$i]["ID"];
   $out.="<li>{$id}</li>";
   
   if($cur<$next){
      $out.="<ul>";
   }
   elseif($cur>$next){
      $out.="</ul>";
   }
}


Für folgende Struktur:
Code:

             1
      3           4
    5   7
  6
8

Würde eine Liste für
Code:

                1
           3
      5       4
    6  7
  8

herauskommen
(Ich hoffe es wird alles ersichtlich)

Da ich mir schon einige Zeit Gedanken darüber mache, wie ich mein Problem löse, bin ich zu dem Schluss gekommen - frag die anderen. Lächel

Also, hat jemand nen besseren Ansatz?
  View user's profile Private Nachricht senden
bacon

Dabei seit: 24.10.2007
Ort: -
Alter: -
Geschlecht: -
Verfasst Mo 01.08.2011 10:49
Titel

Antworten mit Zitat Zum Seitenanfang

SELECT * ORDER BY LFT

Dann musste das ganze entweder: In eine rekursive Datenstruktur packen, oder halt den iterativen Weg gehen - was aber ein wenig mehr Brainfuck bedeutet und nicht wiederverwendbar ist, daher würde ich immer den ersten Weg gehen - die rekursive Datenstruktur ist einfacher zu durchwandern.

Kurzer Tipp: (n-1) level < n level, dann bist Du wohl im ersten Kindknoten von n-1. Ist n-1 level > n level, bist Du wohl mindestens eine Hierararchieebene hochgerutscht.

Viel Spaß *zwinker*

//
Code:

             1
      3           4
    5   7
  6
8


Die Struktur kommt mir irgendwie kaputt vor ...


Code:

                1-14
            2-11        12-13
        3-8   9-10
    4-7
5-6


Wär das so nicht richtiger?
  View user's profile Private Nachricht senden
Anzeige
Anzeige
weltio

Dabei seit: 04.01.2011
Ort: -
Alter: -
Geschlecht: -
Verfasst Mo 01.08.2011 13:47
Titel

Antworten mit Zitat Zum Seitenanfang

Danke, ich werde mich ranmachen und es versuchen.

Die Struktur ist doch dieselbe?! Nur hast du die lft/rgt bounds angegeben und ich die IDs - insofern ist es wohl ein Homomorphismus Lächel

bacon hat geschrieben:
SELECT * ORDER BY LFT

Dann musste das ganze entweder: In eine rekursive Datenstruktur packen, oder halt den iterativen Weg gehen - was aber ein wenig mehr Brainfuck bedeutet und nicht wiederverwendbar ist, daher würde ich immer den ersten Weg gehen - die rekursive Datenstruktur ist einfacher zu durchwandern.

Kurzer Tipp: (n-1) level < n level, dann bist Du wohl im ersten Kindknoten von n-1. Ist n-1 level > n level, bist Du wohl mindestens eine Hierararchieebene hochgerutscht.

Viel Spaß *zwinker*

//
Code:

             1
      3           4
    5   7
  6
8


Die Struktur kommt mir irgendwie kaputt vor ...


Code:

                1-14
            2-11        12-13
        3-8   9-10
    4-7
5-6


Wär das so nicht richtiger?
  View user's profile Private Nachricht senden
bacon

Dabei seit: 24.10.2007
Ort: -
Alter: -
Geschlecht: -
Verfasst Mo 01.08.2011 13:52
Titel

Antworten mit Zitat Zum Seitenanfang

Was soll'n die IDs denn da bringen? Insofern scheint mir das eher ein Idiotismus zu sein *zwinker*
  View user's profile Private Nachricht senden
weltio

Dabei seit: 04.01.2011
Ort: -
Alter: -
Geschlecht: -
Verfasst Mo 01.08.2011 14:03
Titel

Antworten mit Zitat Zum Seitenanfang

bacon hat geschrieben:
Was soll'n die IDs denn da bringen? Insofern scheint mir das eher ein Idiotismus zu sein *zwinker*

Ah, seit wann sind denn die bounds die Bezeichner der Variablen?

Es wird ein Knoten dargstellt - ich nenne den wie ich will... *zwinker*

Btw.
ich habe mich deines Vorschlags angenommen und nach geringer Prüfung festgestellt, dass es zu klappen scheint - allerdings habe ich die korrektheit noch nicht bewiesen, sondern nur ein Ergebnis gesehen und dann auf alle hochgerechnet


Insofern - danke nochmal Lächel


Zuletzt bearbeitet von weltio am Mo 01.08.2011 14:14, insgesamt 2-mal bearbeitet
  View user's profile Private Nachricht senden
schmauch

Dabei seit: 08.02.2012
Ort: -
Alter: -
Geschlecht: -
Verfasst Mi 08.02.2012 15:45
Titel

Antworten mit Zitat Zum Seitenanfang

Habe mich soeben auch mit dem Thema beschäftigt. Die Lösung ist viel einfacher als man zunächst denkt.

Es braucht nicht einmal ein Level. Ganz einfach den Baum nach der LEFT-Spalte sortieren.

Danach alle Einträge der Reihe nach durchlaufen und dabei den aktuellen Left-Wert mit dem vorhergehenden vergleichen. Ist die Erhöhung = 1, neues <ul> öffnen, ist sie = 2, verbleiben wir auf der gleichen Ebene. Ist sie grösser als 2, schliesse so viele <ul>s wie der aktuelle LEFT-Wert minus der vorhergehende LEFT-Wert minus zwei.

Hier ein Beispiel
Code:

// Beispiel-Array
$tree = array(
array('text' => '   A   ', 'lft' =>    1   , 'rgt' =>    52   ),
array('text' => '   B   ', 'lft' =>    2   , 'rgt' =>    27   ),
array('text' => '   C   ', 'lft' =>    3   , 'rgt' =>    24   ),
array('text' => '   D   ', 'lft' =>    4   , 'rgt' =>    13   ),
array('text' => '   E   ', 'lft' =>    5   , 'rgt' =>    10   ),
array('text' => '   F   ', 'lft' =>    6   , 'rgt' =>    7   ),
array('text' => '   G   ', 'lft' =>    8   , 'rgt' =>    9   ),
array('text' => '   H   ', 'lft' =>    11   , 'rgt' =>    12   ),
array('text' => '   I   ', 'lft' =>    14   , 'rgt' =>    23   ),
array('text' => '   J   ', 'lft' =>    15   , 'rgt' =>    22   ),
array('text' => '   K   ', 'lft' =>    16   , 'rgt' =>    17   ),
array('text' => '   L   ', 'lft' =>    18   , 'rgt' =>    19   ),
array('text' => '   M   ', 'lft' =>    20   , 'rgt' =>    21   ),
array('text' => '   N   ', 'lft' =>    25   , 'rgt' =>    26   ),
array('text' => '   O   ', 'lft' =>    28   , 'rgt' =>    51   ),
array('text' => '   P   ', 'lft' =>    29   , 'rgt' =>    34   ),
array('text' => '   Q   ', 'lft' =>    30   , 'rgt' =>    31   ),
array('text' => '   R   ', 'lft' =>    32   , 'rgt' =>    33   ),
array('text' => '   S   ', 'lft' =>    35   , 'rgt' =>    50   ),
array('text' => '   T   ', 'lft' =>    36   , 'rgt' =>    37   ),
array('text' => '   U   ', 'lft' =>    38   , 'rgt' =>    49   ),
array('text' => '   V   ', 'lft' =>    39   , 'rgt' =>    40   ),
array('text' => '   W   ', 'lft' =>    41   , 'rgt' =>    44   ),
array('text' => '   X   ', 'lft' =>    42   , 'rgt' =>    43   ),
array('text' => '   Y   ', 'lft' =>    45   , 'rgt' =>    48   ),
array('text' => '   Z   ', 'lft' =>    46   , 'rgt' =>    47   ),
);


// vor dem Durchlauf des Baums, den aktuellen Left-Wert auf 0 setzen.
$cLft = 0;

// den Baum durchlaufen
foreach($tree as $node)
{
   
   // Bestimmen, ob wir hoch, runter oder seitwärts gehen
   $direction = $node['lft'] - $cLft;
   
   // Falls wir runter gehen sollen, <ul> öffnen
   if(1 == $direction)
   {
      echo '<ul>';
   }
   
   // Falls wir hoch gehen, entsprechend viele <ul>s schliessen
   if(2 < $direction)
   {
      echo str_repeat('</ul>', $direction -2);
   }
   
   // Das aktuelle Element ausgeben
   echo '<li>'.$node['text'].'</li>';
   
   // Left-Wert des aktuellen Elements zwischenspeichern
   $cLft = $node['lft'];
   
}




Gruss schmauch


Zuletzt bearbeitet von schmauch am Mi 08.02.2012 15:46, insgesamt 1-mal bearbeitet
  View user's profile Private Nachricht senden
bacon

Dabei seit: 24.10.2007
Ort: -
Alter: -
Geschlecht: -
Verfasst Mi 08.02.2012 16:16
Titel

Antworten mit Zitat Zum Seitenanfang

Also ich würde im Gegensatz dazu den Baum ganz einfach nach LFT sortieren, macht die Sache viel einfacher.
















* Ich geb auf... *
  View user's profile Private Nachricht senden
 
Ähnliche Themen HTML-Liste mit Nested Sets erstellen
[Wordpress] Dynamisches Menü?!
Dynamisches Flash-Menü auf HTML
Dynamisches Menü für alle Browser
suche bestimmtes script für dynamisches Menü auf Website
CD mit diversen PDF's --> "dynamisches" Flash-Menü
Neues Thema eröffnen   Neue Antwort erstellen Seite: Zurück  1, 2
MGi Foren-Übersicht -> Programmierung


Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst an Umfragen in diesem Forum nicht mitmachen.