Willkommen auf dem Portal für Mediengestalter
|
|
Autor |
Nachricht |
weltio
Dabei seit: 04.01.2011
Ort: -
Alter: -
Geschlecht: -
|
Verfasst Mo 01.08.2011 10:20
Titel
|
|
|
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:
Würde eine Liste für
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.
Also, hat jemand nen besseren Ansatz?
|
|
|
|
|
bacon
Dabei seit: 24.10.2007
Ort: -
Alter: -
Geschlecht: -
|
Verfasst Mo 01.08.2011 10:49
Titel
|
|
|
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ß
//
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?
|
|
|
|
|
Anzeige
|
|
|
weltio
Dabei seit: 04.01.2011
Ort: -
Alter: -
Geschlecht: -
|
Verfasst Mo 01.08.2011 13:47
Titel
|
|
|
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
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ß
//
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? |
|
|
|
|
|
bacon
Dabei seit: 24.10.2007
Ort: -
Alter: -
Geschlecht: -
|
Verfasst Mo 01.08.2011 13:52
Titel
|
|
|
Was soll'n die IDs denn da bringen? Insofern scheint mir das eher ein Idiotismus zu sein
|
|
|
|
|
weltio
Dabei seit: 04.01.2011
Ort: -
Alter: -
Geschlecht: -
|
Verfasst Mo 01.08.2011 14:03
Titel
|
|
|
bacon hat geschrieben: | Was soll'n die IDs denn da bringen? Insofern scheint mir das eher ein Idiotismus zu sein |
Ah, seit wann sind denn die bounds die Bezeichner der Variablen?
Es wird ein Knoten dargstellt - ich nenne den wie ich will...
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
Zuletzt bearbeitet von weltio am Mo 01.08.2011 14:14, insgesamt 2-mal bearbeitet
|
|
|
|
|
schmauch
Dabei seit: 08.02.2012
Ort: -
Alter: -
Geschlecht: -
|
Verfasst Mi 08.02.2012 15:45
Titel
|
|
|
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
|
|
|
|
|
bacon
Dabei seit: 24.10.2007
Ort: -
Alter: -
Geschlecht: -
|
Verfasst Mi 08.02.2012 16:16
Titel
|
|
|
Also ich würde im Gegensatz dazu den Baum ganz einfach nach LFT sortieren, macht die Sache viel einfacher.
|
|
|
|
|
|
|
|
Ä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ü
|
|
|
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.
|
|