RE: [PHP] Function to Build Trees

From: 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 > '&nbsp;&nbsp;';} > 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 >

« previous php.general (#63531) next »