2010-01-31 183 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