On Wed, 2006-08-09 at 14:14 -0400, [EMAIL PROTECTED] wrote:
> My brain is really fried right now and I'm sure someone has a more indepth 
> answer/opinion on this subject, but it occurs to me that you can get away 
> from using eval() if you do some kind of recursive function using:
> 
> $temp[] = array($arrval1, $arrval2,...);
> 
> 
> and $arrval1 could == array($arr2val1, $arr2val2,...);
> 
> 
> using the [] syntax and/or assigning arrays to other array value positions 
> could do what you want it to do if you can work out the resursive 
> functionality.  No need to use strings and eval() all over the place.
> 
> Sorry my head's not up to resursion right now..  plus I never did have as 
> intuitive of a feel for it as I'd ever have liked (understand the concept and 
> can grok other people's stuff, but never bothered writing any of my own);
> 
> Maybe that's a nudge in the right direction while the others finish lunch or 
> coffee or whatever.
> 
> -TG
> 
> = = = Original message = = =
> 
> Hi all:
> I've been trying to create a multidimensional array with n depth in php. 
> Tried to use a recursive function passing array references by pointers but 
> seems like it's not possible or I still don't understand this subject 
> enough. Finally managed to get it going using the eval function. The code 
> below converts a seperated string into a multi dimensional array with n 
> depth:
> 
> e.g. $array['1_20-2_16-7_14'] = 12 will become 
> $eval_array[1][20][2][16][7][14] = 12
> 
>       foreach(array_keys($this->quantity_array) AS $key)
>         if($this->quantity_array[$key] > 0)
>           $combinations = explode('-', $key);
>           $eval_string = '$eval_array';
>           foreach(array_keys($combinations) AS $key2)
>             $option_key_value = explode('_', $combinations[$key2]);
>             $eval_string .= 
> '['.$option_key_value[0].']['.$option_key_value[1].']';
>           
>           $eval_string .= ' = '.$this->quantity_array[$key].';';
>           eval($eval_string);
>         
>       
> 
> Using eval() for it seems a bit expensive to me. So I've been wondering if 
> there is an easier way?

Yep, that's pretty bad use of eval()  :) Instead use recursion or a
sliding reference:

<?php
   
$key = '1_20-2_16-7_14';
$val = 12;

$bits = split( '_|-', $key );
$nested = array();
$ref = &$nested;
$lastref = null;

foreach( $bits as $bit )
{
    $lastRef = &$ref;
    
    $ref[$bit] = array();
    $ref = &$ref[$bit];
}
 
if( $lastRef === null )
{
    $nested = $val;
}
else
{
    $lastRef[$bit] = $val;
}
 
print_r( $nested );

?>

Cheers,
Rob.
-- 
.------------------------------------------------------------.
| InterJinn Application Framework - http://www.interjinn.com |
:------------------------------------------------------------:
| An application and templating framework for PHP. Boasting  |
| a powerful, scalable system for accessing system services  |
| such as forms, properties, sessions, and caches. InterJinn |
| also provides an extremely flexible architecture for       |
| creating re-usable components quickly and easily.          |
`------------------------------------------------------------'

-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to