Hallo dedlfix!
Spielen wir mal die Stack-Variante ausgehend von dem Array deines Eingangspostings durch. i = Element 0, das hat L=0 und R=3, es ist ein Elter. Das kommt auf den Stack, aber erstmal schauen, ob das L vom i+1 kleiner als unser R ist. Das ist der Fall, also gibt es mindestens einen Nachkommen, der Abstieg lohnt sich.
Ok soweit komme ich fast noch mit. Das bedeutet also, dass die Anzahl der Elemente auf dem Stack = der aktuellen Ebene sind? Also kann ich in jedem Schleifendurchlauf dem aktuellen Array den Wert hinzufügen?
Ich würde die Html-Liste gern erstmal in einer extra Schleife zusammenstellen damit ich den Überblick im Code nicht verliere.
(Wenn das L allerdings kleiner als oder gleich unserem L ist, dann hast du einen Nebenbaum - allerdings passt diese Aussage nicht mehr, wenn es Teilbäume ohne Wurzeln gibt - aber vielleicht bekommst du sowas anhand der Menü-ID oder ähnlichem auseinandergehalten.)
Was meinst du damit? Es gibt keine Menüs innerhalb von Menüs. Also Menüpunkt X von Menü A wird niemals Menü B sein. Oder habe ich dich falsch verstanden?
Ich habe es jetzt erstmal so. Es ist sicher nicht sehr elegant (das werde ich später optimieren) aber es scheint erstmal so zu funktionieren wie ich mir das vorgestellt habe.
Könntest du bitte mal schauen ob ich dich richtig verstanden und es richtig umgesetzt habe?
for($i = 0; $i < count($this->arrMenuItems); $i++){
echo 'Name: '.$this->arrMenuItems[$i]['name']." - Level: ";
// letzten Elter suchen
$arrParent = array_pop($this->arrStack);
// Element ein Elter, Kinder vorhanden?
if(isset($this->arrMenuItems[$i+1]) && $this->arrMenuItems[$i+1]['leftkey'] < $this->arrMenuItems[$i]['rightkey']){
echo count($this->arrStack)." \n";
$this->arrStack[] = $arrParent;
$this->arrStack[] = $this->arrMenuItems[$i];
continue;
}
// Element ein Blatt?
if($this->arrMenuItems[$i]['leftkey']+1 == $this->arrMenuItems[$i]['rightkey'] && $this->arrMenuItems[$i]['rightkey'] < $arrParent['rightkey']){
echo count($this->arrStack)." \n";
$this->arrStack[] = $arrParent;
continue;
}
// Element höher oder neben des letzten Elter?
if($this->arrMenuItems[$i]['leftkey'] > $arrParent['rightkey']){
$this->arrStack[] = $arrParent;
// stack abbauen
while($this->arrMenuItems[$i]['rightkey'] > $arrParent['rightkey'] && count($this->arrStack) != 0){
$arrParent = array_pop($this->arrStack);
}
echo count($this->arrStack)." \n";
continue;
}
}
$arrParent ist am Anfang ein leeres Array. Das müsste ich auch noch ändern. Den Stack am Ende zu leeren würde doch auch ein $arrStack = array() oder null am Ende reichen, oder warum überhaupt den Stack leeren? Kommt das zum tragen wenn ich direkt eine Html-Liste ausgebe?
Herzlichen Dank für deine Geduld! :)