phpbar.de logo

Mailinglisten-Archive

[php] Baumstruktur ?

[php] Baumstruktur ?

Martin Fenn palim_(at)_augusta.de
Thu, 7 Oct 1999 22:59:54 +0100


Hallo Alex,

(sorry Liste, wird jetzt ein wenig lang ...)

> > Kuck Dir mein Teil an ... das basiert glaub ich auf dem Proggie ...
> hmm wie umgehst du denn das?
Wenn Du Dir vorstellst, das eigentlich nur die Methode ausgetauscht 
wird, mit der die Daten in das Array geschrieben werden, ist es ganz 
einfach ... ;-)

> bzw wie kann man $Buffer darin einlesen
> wenn in $Buffer das gleiche wie in in dem File steht ?
Der Buffer liest ja nur zeilenweise bis End-Of-Line ... der ist nur 
fuer denn schlimmsten Fall der Faelle mit 4096 Zeichen lang ... 
naemlich eine Zeile mit soviel Zeichen ... 

Jetzt droesel ich Dir mal die Sache auf und sage, was ich ersetzt 
habe:

> $fd = fopen($treefile, "r");
>   if ($fd==0) die("treemenu.inc : Unable to open file ".$treefile);
>   while ($buffer = fgets($fd, 4096)) 
hab ich gestrichen ...

>   {
>     $tree[$cnt][0]=strspn($buffer,".");
>     $tmp=rtrim(substr($buffer,$tree[$cnt][0]));
>     $node=explode("|",$tmp); 
dito.

Den folgenden Block habe ich dann in die gaaaanz untenstehende 
Funktion gepackt, die sich selbst rekursiv aufruft und die Daten in 
das Array schreibt.
>     $tree[$cnt][1]=$node[0];
>     $tree[$cnt][2]=$node[1];
>     $tree[$cnt][3]=$node[2];
>     $tree[$cnt][4]=0;
>     if ($tree[$cnt][0] > $maxlevel) $maxlevel=$tree[$cnt][0];   
>     $cnt++;

So, und nun mal mein (gekuerzter) Codeblock, der statt dem Zeuch da 
oben im File steht:

   /* Datenbank oeffnen */
  $linkid = mysql_connect($host, $user, $password);
  $db = mysql_select_db($database, $linkid);
  
  /* Startwerte */
  $maxlevel = 0;
  $cnt = 0;
    
  /* Menupunkte rekursiv in das Array tree einlesen */
  readMenuItems(0, 1);

Die Funktion "readMenuItems" liest die Daten aus und und schreibt sie 
in das (globale) Array $tree ... das ist die Schnittstelle zum Rest 
von PHPMenu ...

So, nun die Funktion:

##### Funktion #####

/* rekursives Auslesen des Site-Menus       */
/* die Daten werden in ein Array eingeordnet */
	function readMenuItems($nodeid, $position)
	{
		global $tree;
		global $cnt;
		global $maxlevel;
		
		$rs = mysql_query("SELECT * FROM h_menu WHERE nodeid = 
                           $nodeid ORDER BY mnutitle");
		
		/* Durch die Leafs gehen und Daten einlesen */
		while ($data = mysql_fetch_array($rs))
		{
   			$tree[$cnt][0] = $position; //Einrueckung
   			$tree[$cnt][1] = $data["mnutitle"];
   			$tree[$cnt][2] = $data["mnuurl"];
   			$tree[$cnt][3] = "content"; // Zielframe
   			$tree[$cnt][4] = 0;
   			if ($tree[$cnt][0] > $maxlevel) 
					$maxlevel=$tree[$cnt][0];
   			$cnt++;
	    		
   			/* Haengt ein Leaf am Leaf? einfach mal rekursiv 
               runtergehen und nachkucken ... */
			readMenuItems($data["mnuid"], ($position + 1));
		}
		
		/* Fallback aus der Rekursion */
		return;
	}

##### Funktion ENDE #####  

Na, den Codeblock mit $tree wiedererkannt?
Wichtig ist auch noch die Datenbanktabelle ... die muss noch ein Feld 
haben, in dem die ID des Vorgaengerknotens drinsteht ("nodeid") ...


Ein Zip-File mit dem Teil (reimt sich ... :-) ) findest Du unter
http://multimed1.fh-reutlingen.de/newweb/files/explorermenu.zip

So, das wars jetzt aber ...

hoffe geholfen zu haben ...

Bye,
   Martin

______________________________________________________________________________

         Diese Nachricht besteht zu 100% aus chlorfrei gebleichten, 
                 gluecklichen und zufriedenen Elektronen


Martin Fenn
palim_(at)_augusta.de                          martin.fenn_(at)_student.fh-reutlingen.de
                                        ______________________________________
http://www.augusta.de/~palim   /\  /\  | 
                              /  \/  \ |---
_____________________________/        \|

LOOK: http://multimed1.fh-reutlingen.de


php::bar PHP Wiki   -   Listenarchive