|  | Posted by Stefan Rybacki on 12/15/05 19:19 
Hilarion wrote:>> Zilla wrote:
 >> > ...
 >
 >
 > Stefan Rybacki <stefan.rybacki@gmx.net> wrote:
 >
 >> Here is another solution:
 >
 >
 > :) Actually I also wrote my solution before posting first post in this
 > topic,
 > but I decided not to post it when I saw your (Stefan) post reading:
 >
 
 me too, but after reading Zillas post I thought of presenting another, maybe
 more straight forward, solution can't be wrong ;)
 
 >> First you could start with creating items in a single array from the
 >> mysql resultset, use the id as key.
 >> Afterwards you simply can create a tree like array by using the first
 >> array accessed by the parentid.
 >
 >
 > This was exact description of my solution.
 >
 > Your script looks almost like mine (differences in some details, which
 > I described below and in names of variables).
 >
 
 Ok, go ahead.
 
 >
 >> <?php
 >>
 >> //creates a node array
 >> function make_node($id,$uri,$name,$parent) {
 >>   return array(
 >>
 >> 'id'=>$id,'uri'=>$uri,'name'=>$name,'parent_id'=>$parent,'sub_forums'=>array()
 >>
 >>   );
 >> }
 >
 >
 > You do not really need that function because the result from the DB is
 > almost
 > exactly like what you need.
 
 Correct, I did it because I thought an extraction of this task can't be wrong
 since the OP may wants to rethink this kind of storage in a node however its not
 really needed yet.
 
 >
 >
 >> //target array
 >> $root=array();
 >
 >
 > In my solution I created $root (under different name)
 > at the end of the script.
 
 yeah. Its equal.
 
 >
 >
 >> //helps us to access items fast
 >> $helptable=array();
 >>
 >> //insert root node
 >> $helptable[0]=array('sub_forums'=>&$root);
 >>
 >> //get items
 >> $con=mysql_connect("localhost","root","");
 >> mysql_select_db("test");
 >>
 >> $res=mysql_query("SELECT * FROM testtable");
 >>
 >> //first collect all items
 >> while($row=mysql_fetch_assoc($res)) {
 >>   //insert item into help table
 >>   $helptable[$row['id']] =
 >> make_node($row['id'],$row['uri'],$row['name'],$row['parent_id']);
 >
 >
 > I've done it like this:
 >
 > $helptable[ $row['id'] ] = $row;
 > $helptable[ $row['id'] ][ 'sub_forums' ] = array();
 >
 
 yes thats fine.
 
 
 > and it also could be done like this:
 >
 > $row[ 'sub_forums' ] = array();
 > $helptable[ $row['id'] ] = $row;
 >
 
 sure.
 
 >
 >> } // while
 >>
 >> //now run thru all items and build the tree array (just means add
 >> childs to //parents)
 >> foreach ($helptable as $k=>$v) {
 >>   if ($k!=0) {
 >>
 >>
 >> $helptable[$helptable[$k]['parent_id']]['sub_forums'][count($helptable[$helptable[$k]['parent_id']]['sub_forums'])]=&$helptable[$k];
 >>
 >
 >
 > I made it a bit shorter like this:
 >
 > $helptable[$v['parent_id']]['sub_forums'][] = & $helptable[$k];
 >
 
 yes thats even better and more readable, my first solution worked with
 array_push but array_push didn't take references of variables so I came up with
 the line above with missing the obvious ;)
 
 
 >
 >>   }
 >> }
 >
 >
 > Here I created my $root:
 >
 > $root = $helptable[0]['sub_forums'];
 >
 
 yep almost the same.
 
 >
 >> unset($helptable);
 >> //now $root contains the desired tree
 >> print_r($root);
 >>
 >> mysql_free_result($res);
 >> mysql_close($con);
 >>
 >> ?>
 >
 
 Well done, Hilarion ;)
 
 >
 >
 > Hilarion
 
 
 Regards
 Stefan
 [Back to original message] |