2010-01-31 146 views
0

我想创建一个基于字符串的多维数组。多维数组

,所述串具有值$string="1/2/3"

,我想分配$array[1][2][3]=somethimg

实际上该阵列的索引是在$串

的$字符串内描述有不相同的深度。

例如可能是$ string =“1/2 OR $ string =”1/2/3/4/5 OR $ string =“1/2/3/5/7/8/9/9/6 所以多维数组中的键的数量不达标

任何想法

回答

1

尝试用

<?php 
$ind = '1/2/3/4/5/6/7/8/9/10/11/12'; 

$ind = '[' . join('][', explode('/',$ind)) . ']'; 
$fn = create_function('$var, $val','global ${$var}; ${$var}'. $ind. '= $val;'); 
$array = array(); 
$fn("array", "something"); 
echo '<pre>'.print_r($array, true).'</pre>'; 
?> 

大部分simplier版本

<?php 
$ind = '1/2/3/4/5/6/7/8/9/10/11/12'; 
$ind = '[' . join('][', explode('/',$ind)) . ']'; 
$array = array(); 
$val = "something"; 
eval('$array'.$ind.'=$val;'); 
echo '<pre>'.print_r($array, true).'</pre>'; 
?> 

有些人会杀了我的eval函数,但在这种情况下,完全:-P

+0

非常感谢,它的工作非常完美。 – ntan 2010-01-31 11:22:41

+0

我添加了另一个解决方案。它非常简单。 – Rafael 2010-01-31 11:24:38

2
$string = '1/2/3'; 
list($x, $y, $z) = explode('/', $string); 

$array[$x][$y][$z] = 'something'; 
+0

对不起,我编辑我qieustion – ntan 2010-01-31 10:34:31

0

假设你的字符串格式:

list($lev1, $lev2, $lev3) = explode('/', $string); 
$array[$lev1][$lev2][$lev3] = $something; 

您的编辑后 - 你可以使用递归功能如下:

$string = '1/2/3/4/5/6/7/8'; 
$value = 'something'; 

print_r(build_array($string, $value)); 

function build_array($string, $value, $array = array()) { 
    list($key, $rest) = explode('/', $string, 2); 
    if ($key) { 
     $array = array(
      $key => build_array($rest, $value, $array[$key]) 
     ); 
     return $array; 
    } else { 
     return $value; 
    } 
} 
0

这里有一个递归解决方案,为任意数量的指数的工作:

function set_by_indices(&$arr, $indices, $val) { 
    if (count($indices) == 1) { 
    $arr[$indices[0]] = $val; 
    } else { 
    set_by_indices($arr[$indices[0]], array_slice($indices, 1), $val); 
    } 
} 

$arr = array(array(array(1 => 1, 2 => 4), 
        array(1 => -1, 2 => -2)), 
      array(array(1 => 11, 2 => 14), 
        array(1 => -11, 2 => -12))); 
$str = '0/0/1'; 

$indices = explode('/', $str); 

print_r($arr); 
set_by_indices($arr, $indices, 99); 
echo '<br/>'; 
print_r($arr); 

输出:

Array ([0] => Array ([0] => Array ([1] => 1 [2] => 4) [1] => Array ([1] => -1 [2] => -2)) [1] => Array ([0] => Array ([1] => 11 [2] => 14) [1] => Array ([1] => -11 [2] => -12))) 
Array ([0] => Array ([0] => Array ([1] => 99 [2] => 4) [1] => Array ([1] => -1 [2] => -2)) [1] => Array ([0] => Array ([1] => 11 [2] => 14) [1] => Array ([1] => -11 [2] => -12))) 
+0

,用来获取,而不是设置工程工作。 – 2010-01-31 10:48:27

+0

我的不好。在编辑中修复。同样的想法适用,除了东西通过引用传递。 – 2010-01-31 11:00:13