Baum-Funktion

xcite_swEEper

Grünschnabel
Sers,

bin gerade dabei, ne schöne kleine Gruppen-Klasse zu basteln, also mit der man dann z.B. Downloads in eine Hirarchie einbauen kann.

Also jede Gruppe hat eine "parent"-Gruppe, so lassen sich dann eben solche schönen Gruppenbäume aufbauen.

Klappt auch soweit alles ganz gut, jetzt will ich aber gerade noch eine Funktion basteln, die mir, ausgehend von einer bestimmten Gruppe, die IDs aller Untergruppen und wieder deren Untergruppen usw. in Form eines multidimensionalen Arrays liefert.

Der Tree könnte zB so aussehen

Code:
return array {

1
   2
      3
          4
         5
         6
      8
   
   9
      10
      11
           12
           13
               14
      16
   
usw.
}
wobei dann z.B. das "parent" von 14 wäre 13, das von 6 wäre 4, das von 16 wäre 9 usw.

das return-array sollte eben diesen tree durch mehrere dimensionen wiederspiegeln ..

Jetzt habe ich schon eine Funktion getChildren($ID) die ein Array mit den ID's der "Kinder" von der group mit der ID $ID zurückgibt:
PHP:
          /**
	 * groups::getChildren()
	 * 
	 * returns subordinated groups
	 * 
	 * @param $ID
	 * @return array ID's of subordinated groups
	 **/
	function getChildren($ID) {

		$this->sql->select($this->config['table'],'ID','WHERE parent = $ID');
		
		if ($this->sql->num() == 0) 
			return FALSE;
		
		$i = 0;

		while($row = $this->sql->row()) {
		    $return[$i] = $row['ID'];
		    $i++;
		}
		
		return $return;
	}

Nun meine Frage:

Wie soll ich die Funktion getTree aufbauen:
PHP:
/**
	 * groups::getTree()
	 * 
	 * returns multi-dimensional array containing the IDs
	 * of all groups which are subordinated to $ID (including subgroups)
	 * 
	 * @param $ID
	 * @return array
	 **/
	function getTree($ID) {
	
	
	}

Also wie gesagt, getChildren gibt ein eindimensionales Array zurück mit den groupIDs der Kinder von $ID. Nun muss ja wieder für jedes dieser Kinder eine Abfrage an getChildren ausgeführt werden. Das Ganze muss eben solange weitergehen, bis getChildren "FALSE" zurückgibt (=Keine Kinder).
Vermutlich ist es am einfachsten mit irgend einer "while"-Konstruktion .. allerdings ist mir bisher kein wirklich guter Weg eingefallen...
Oder geht es gar nicht, ohne die Methode rekursiv zu gestalten?

Hoffe mir kann jemand helfen ... auch wenn es nun mal ein bisschen anspruchsvoller ist als dieses dauernde "Wie krieg ich die Texte aus den Textfeldern in meine Datenbank?" ;)

thx,
swEEper
 
Das ist mit einer einfachen Rekursion zu lösen, allerdings ist das absolut inperformant. Informier dich mal über das Thema Nested Sets. Das sollte in deinem Fall die bessere Alternative sein.
 
Zurück