phpbar.de logo

Mailinglisten-Archive

[php] Nested Sets

[php] Nested Sets

Jörn Grube jg at team-spandau.de
Sam Nov 10 21:39:36 CET 2007


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