RE: [PHP] Function to Build Trees
| From: | Dan Harrington | Date: | Mon, 20 Aug 2001 16:27:42 +0000 |
| Subject: | RE: [PHP] Function to Build Trees | ||
| References: | 1 | Groups: | php.general |
| Request: | Send a blank email to php-general+get-63531@lists.php.net to get a copy of this message | ||
Or you could just buy from http://www.plumbdesign.com/
or write a PHP SDK for them.
:-)
> -----Original Message-----
> From: Chris Hayes [mailto:chayes@antenna.nl]
> Sent: Monday, August 20, 2001 4:15 AM
> To: php-general@lists.php.net
> Subject: Re: [PHP] Function to Build Trees
>
>
> > Onderwerp: [PHP] Function to Build Trees
>
> A most interesting question!
>
>
> > Given a multidimensional array with words as keys, I want to match
> > the values of each array with the keys of the array and build a new
> > array that reflects these relationships as a sort of tree. So, in
> > the list below, "fruit", "apples", "oranges",
> > "red" are the keys and
> > in the "fruit" array are the values "apples" and "oranges",
> > so I want
> > the function to create a new array that looks like:
> >
> > ORIGINAL ARRAY:
> > $array['fruits'] =
> > array("apples","oranges","pears");
> > $array['apples'] = array("red","granny smith");
> > $array['oranges'] = array('mandarin');
> > $array['red'] = array("big red","small red");
> >
> > NEW ARRAY:
> > $array['fruits'] = array(apples,oranges,pears);
> > $array['fruits']['apples'] = array("red","granny
> > smith");
> > $array['fruits']['oranges'] = array('mandarin');
>
> At first peek i fear endless loops. But never mind about those :-). Well not
> never, i think you MUST test new data on the loop danger.
> What may cause loops?
> $array['fruits'] =
> array("apples","oranges","pears");
> $array['apples'] = array("red","granny
> smith","fruit");
> May cause an endless array fruit-apple-fruit-apple- ad infinitum.
>
>
> > And then I want it further to figure out that "red", now in the array
> > found at: $array['fruits']['apples'] matches a key in the original
> > array so the final result looks like:
> >
> > FINAL ARRAY:
> > $array['fruits'] = array(apples,oranges,pears);
> > $array['fruits']['oranges'] = array('mandarin');
> > $array['fruits']['apples'] = array("red","granny
> > smith");
> > $array['fruits']['apples']['red'] = array("big
> > red","small red");
> >
> > So, you see how it builds a little tree, right?
>
> I think the thing is to make a step by step description of what should be
> done.
> Write the logic down with this example in a way that can be translated into
> array handling functions (walk through, search, add).
>
> I think there are several ways to approach it.
>
> Mine would be probably.....
>
> STEP 1: find highest in hierarchy to make stems
> a Make $highest_keywords_array contain all mentioned keywords.
> b Now look for every key if there is a 'higher' keyword, if so delete it
> from this array.
> c You should in your example end up with $highest_keywords_array containing
> only 'fruit'.
>
> STEP 2: build on branches and twigs
> Now go through the initial array several times and glue on branches that go
> under the highest keywords, then twigs, twiglets, twigletlets...
> Make every word $highest_keywords_array a 1st level result array item
> Walk through 1st level keys,
> For every key look in initial array for the values
> Stick these values in the result array: array[thiskey]=[value]
> Walk through 2nd level
>
> Ad 1b:
> For every word in array see if it is in the array at a 'value location'. No
> idea how to do it - ask the group.
>
> Ad 2:
> I don't know how to make this function go through all existing values. I am
> not going to break my early morning brain on it as i a not sure you will use
> this approach.
> Correction. Some questions are too tempting so i still tried.
>
> STEP 1 results in:
> $arrayname=array(keys at 1st level, i.e. fruit);
> STEP 2
> function GLUE ($arrayname)
> {global $arrayname;
> for every KEY in $arrayname [at this level]
> { $arrayname[KEY] = initial array[key]
> GLUE ($arrayname[KEY])
> }
> }
> GLUE($array_with_first_level_keys)
> This should do the reciprocal thing as efficient as possible.
>
> Think about strawberry (red) (small,big)
> apple (red) (small,big)
> when making this leveled function (or maybe reciprocal).
>
>
>
> This system should leave no orphans, as orphans should have been at the
> highest hierarchy.
>
> hope this helps (let me know!)
>
> Chris
> ---------------------------------------------------------
>
>
> PS shit i couldn't help it:
>
>
>
>
> <?php
>
> $array_in['apples'] = array("red","granny smith");
> $array_in['fruits'] =
> array("apples","oranges","pears");
> $array_in['oranges'] = array('mandarin');
> $array_in['red'] = array("big red","small red");
> $array_in['oranges'] = array('mandarins');
>
>
> #STEP 1: find highest in hierarchy to make stems
> #a Make $highest_keywords_array contain all mentioned keywords.
>
> $highest_keywords_array = array_keys($array_in);
>
>
>
> #first make a list of all values
> $values_array[]='';
> function val_array (&$arrayname)
> {global $values_array;
> foreach
> (array_values($arrayname) as $key)
> {if
> (!is_array($key))$values_array[] = $key;
> val_array ($key);
> }
> }
> val_array(&$array_in );
>
> ECHO '<b>Original keywords:</b>'; foreach ($highest_keywords_array as
> $key)
> { echo $key .' - ';}
> ECHO '<br><b>Original values:</b>'; foreach ($values_array as $val)
> { echo
> $val .' - ';};
>
> #b Now look for every key if there is a 'higher' keyword, if so delete it
> from this array.
>
> $position=0;
> foreach ($highest_keywords_array as $key)
> {if (in_array($key,$values_array))
> {array_splice($highest_keywords_array,$position,1);$position--;}
> $position++;
> }
>
>
> ECHO '<br><b>Stripped to highest level keyword(s):</b>';
> foreach ($highest_keywords_array as $key) { echo $key .' ';}
>
>
> $arrayname=$highest_keywords_array ;
>
> function GLUE (&$arrayname)
> { global $array_in;
> $position=0;
> foreach ($arrayname as $key)
> {#echo '<br>^'.$key.'--
> '.$array_in[$key].'['.isset($array_in[$key]).']';
> if (isset($array_in[$key])){
> $arrayname[$key] =
> $array_in[$key];
> GLUE ($arrayname[$key]);
> $position++;
> }
> }
>
> }
> GLUE(&$arrayname );
>
> # done, now show it!
>
> echo "<table bgcolor=green
>
> border=1><tr><td><b>Level</></td><td><b>value</></td></tr>";
> function showarray (&$arrayname,$level)
> { foreach ($arrayname as $key)
> {
> if (!is_array($key))
> {echo "<tr><td>$level</td><td>";
> for ($i=0;$i<$level;$i++) {echo
> ' ';}
> echo '-'.$key.'</td></tr>';
>
> }
> if (is_array($arrayname[$key])) showarray
> ($arrayname[$key],$level+1);
> }
> }
> showarray(&$arrayname,0 );
>
> echo '</table>';
>
>
> ?>
>
>
> --------------------------------------------------------------------
> -- C.Hayes Droevendaal 35 6708 PB Wageningen the Netherlands --
> --------------------------------------------------------------------
>
>
>
> --
> PHP General Mailing List (http://www.php.net/)
> To unsubscribe, e-mail: php-general-unsubscribe@lists.php.net
> For additional commands, e-mail: php-general-help@lists.php.net
> To contact the list administrators, e-mail: php-list-admin@lists.php.net
>