Mailinglisten-Archive |
Ok, ich trau mich das jetzt hier kaum zu posten, aber mehr als mich für lausigen Code und mangelhafte Logik rügen könnt ihr ja nicht :) Und daraus kann ich ja nur lernen :) Also hier die Lösung meines Problems: -----code----- // fuer die Ausgabeschleife (while-Bedingungen) $iA = 0; $numBaumAnzeige = $baumAnzeige->numrows(); // und dann brauchen wir noch einen Vergleich der Level $level_old = 0; // und einen Vergleich der linken Begrenzer $left_old = 0; // da auf jeden Fall mit einer Liste angefangen wird, kann die geoeffnet werden echo '<ul><li>'; // Schleife fuer die Ausgabe while($iA < $numBaumAnzeige) { $rowBaumAnzeige = $baumAnzeige->fetch(); // was jetzt kommt, muss nicht sein, macht das Ding aber uebersichtlicher $name = $rowBaumAnzeige['name']; $level = $rowBaumAnzeige['level']; $nachfahren = $rowBaumAnzeige['nachfahre']; $left = $rowBaumAnzeige['sideleft']; // $level_old ist 0 und $level ebenfalls, es handelt sich also um den absoluten root if(($level_old == 0) AND ($level == 0)){ echo $name.' => Level '.$level.' mit '.$nachfahren.' Nachfahren'."\n"; } else { // um alle Moeglichkeiten abzudecken, gibt es eine lange Liste mit IF-Statements // da kann man sicher noch optimieren // ist der aktuelle Level hoeher als der alte und gibt es weitere Nachfahren // handelt es sich um einen Ast, auf jedem Fall muss eine geschachtelte Liste geoeffnet werden if(($level > $level_old) AND ($nachfahren > 0)){ // die Einrueckung wird ueber das Level berechnet echo '<ul style="padding-left: '.($level * 10).'px;">'."\n"; echo '<li>'; echo $name.' => Level '.$level.' mit '.$nachfahren.' Nachfahren'."\n"; // $level_old und $left_old aktualisieren $level_old = $level; $left_old = $left; } // ist der aktuelle Level hoeher als der alte und es gibt keine Nachfahren // handelt es sich um ein Blatt if(($level > $level_old) AND ($nachfahren == 0)){ echo '<ul style="padding-left: '.($level * 10).'px;">'."\n"; echo '<li>'; echo $name.' => Level '.$level.' mit '.$nachfahren.' Nachfahren</li>'."\n"; // sollte der Baum jetzt am Ende sein, muss die Liste noch geschlossen werden if(($iA + 1) == $numBaumAnzeige){ echo '</ul>'."\n"; } // $level_old und $left_old aktualisieren $level_old = $level; $left_old = $left; } // ist alter und neuer Level gleich und es gibt keine Nachfahren // handelt es sich um Rippen desselben Blattes // da nun aber der vorige IF einmal wahr waere, // muss das per Hilfe von $left ausgeschlossen werden if(($level == $level_old) AND ($nachfahren == 0) AND ($left_old != $left)){ echo '<li>'.$name.' => Level '.$level.' mit '.$nachfahren.' Nachfahren</li>'."\n"; // sollte der Baum jetzt am Ende sein, muss die Liste noch geschlossen werden if(($iA + 1) == $numBaumAnzeige){ echo '</ul>'."\n"; } // $level_old und $left_old aktualisieren $level_old = $level; $left_old = $left; } // das vorhergehende Blatt ist erledigt, // der aktuelle Level ist kleiner als der alte und es gibt Nachfahren if(($level < $level_old) AND ($nachfahren > 0)){ // es gibt in jedem Fall eine ungeschlossene Liste darueber, // die wird zuerst geschlossen echo '</ul>'."\n"; echo '<li>'.$name.' => Level '.$level.' mit '.$nachfahren.' Nachfahren</li>'."\n"; // $level_old und $left_old aktualisieren $level_old = $level; $left_old = $left; } // und der letzte, der aktuelle Level ist kleiner als der alte, es gibt aber keine Nachfahren if(($level < $level_old) AND ($nachfahren == 0)){ // es gibt in jedem Fall eine ungeschlossene Liste darueber, // die wird zuerst geschlossen echo '</ul>'."\n"; echo '<li>'.$name.' => Level '.$level.' mit '.$nachfahren.' Nachfahren</li>'."\n"; // sollte der Baum jetzt am Ende sein, muss die Liste noch geschlossen werden if(($iA + 1) == $numBaumAnzeige){ echo '</ul>'."\n"; } // $level_old und $left_old aktualisieren $level_old = $level; $left_old = $left; } } $iA++; } // erste, umschliessende Liste, schliessen echo '</li></ul>'; } -----codeende----- Liebe Grüße aus Berlin und schönes Wochenende Jörn
php::bar PHP Wiki - Listenarchive