| 
	
 | 
 Posted by Christopher Fulton on 07/06/05 01:55 
On 7/5/05, Jochem Maas <jochem@iamjochem.com> wrote: 
> hi everyone, 
>  
> I have a function which recursively loops an assoc array in 
> order to build an HTML string containing hidden <input> elements 
> that repesent the key/values passed in the array ... I know this can 
> be done without recursion but I'm having a brainfreeze, anyone care 
> to share some tips on replacing the recursion with some kind of stack 
> based solution (the idea being that I want to remove the overhead 
> of the recursive calls to the function if possible ... 
>  
> I'm looking to get a better understanding of alternatives to 
> recursion in general rather than in this specific example, 
> so come people show us what you can do! :-) 
>  
> example: 
>  
> function rec_build_hidden_inputs($args = array(), $prefix = '') 
> { 
>      static $inputTpl = "<input type="hidden" name="%s" value="%s" />\n"; 
>  
>      $_contents = ''; 
>      foreach ($args as $key => $val) { 
>          $nextPrefix = $prefix > '' 
>                      ? "{$prefix}[{$key}]"; 
>                      : $key 
>                      ; 
>  
>          $_contents .= is_array($val) 
>                      ? rec_build_hidden_inputs($val, $nextPrefix) 
>                      : sprintf($inputTpl, $nextPrefix, $key) 
>                      ; 
>      } 
>  
>      return $_contents; 
> } 
>  
> rgds, 
> Jochem 
>  
> PS - do ya think I can copyright this?: 
>  
>         = 
>         ? 
>         : 
>         ; 
>  
> nah, didn't think so - none the less you might be surprised how many people 
> it annoys ;-) 
>  
> -- 
> PHP General Mailing List (http://www.php.net/) 
> To unsubscribe, visit: http://www.php.net/unsub.php 
>  
>  
 
This is completely untested (sry, don't have the time right now to 
test it), but something like this should work.... 
 
$inputTpl = "<input type="hidden" name="%s" value="%s" />\n"; 
$recursiveStack = array(); 
 
// change  firstArgs and firstPrefix to the first values in your array 
$firstArgs = array(); 
$firstPrefix = ''; 
$recursiveStack[] = array("args"=>$firstArgs, "prefix"=>$firstPrefix); 
$_contents = ''; 
 
while($currVal = array_pop($recursiveStack)) { 
   $args = $currVal["args"]; 
   $prefix = $currVal["prefix"]; 
   foreach($args as $key=>$val) { 
      $nextPrefix = $prefix > '' 
         ? "{$prefix}[{$key}]"; 
         : $key 
         ; 
      if(is_array($val)) { 
         array_push($recursiveStack, array("args"=>$val, 
"prefix"=>$nextPrefix)); 
      } else { 
         $contents .= sprintf($inputTpl, $nextPrefix, $key); 
      } 
   } 
}
 
  
Navigation:
[Reply to this message] 
 |