2011-11-03 146 views
1

我有一个这样的数组:PHP:构建多维数组

Array(
    'level1' => 'someval', 
    'level2' => 'someotherval', 
    'level3' => 'thirdval' 
) 

我希望把它变成这样:

Array(
    'someval' => Array(
    'someotherval' => Array(
     'thirdval' => 1 
    ) 
) 
) 

很显然,我可以用手工打造上面的例子,但我不不知道会有多少关卡。这个简单的例子看起来没有用处,但是会有更多的值,所以每个级别都会有多个数组。

+0

哪里的值'1'从何而来? –

+0

你的问题有点含糊?你需要在多维数组内存储什么?什么声明数组需要嵌套到哪个级别等等?这种模式会继续还是会在某些层次上包含多个值? –

+0

@Tim Cooper对不起,这是一个错字。 – user774528

回答

2

这将做到这一点

$array = array(
      'level1' => array(
      'level2' => array(
       'level3' => 1 
      ) 
      ) 
     ); 
+5

我猜OP想让它变成动感... – gustavotkg

+1

对不起,我打错了部分我的问题。也请看最后一段。我可以按照您演示的方式轻松构建数组,但我不知道会有多少级别,所以我需要递归循环遍历它或类似的东西。 – user774528

+0

不确定你在找什么,但你可能会研究“通过引用”和“递归”函数/方法调用。这可能有助于你理解一些。 – jjwdesign

0

您是否需要这样的事?

$levels = array_keys(Array(
    'level1' => 'someval', 
    'level2' => 'someotherval', 
    'level3' => 'thirdval' 
)); 
$array = Array(); 
$aux = &$array; 
foreach ($levels as $level => $value) { 
    if ($aux == 1) 
     $aux = array($value => 1); 
    $aux = &$aux[$value]; 
} 
var_dump($array); 
+0

从未尝试过在PHP中使用“&”。看起来不错。将尝试它:) – Jeune

0

这是我对此采取:

function make_multi_level_array($arr) { 
     if (count($arr) == 1) return array(array_pop($arr) => 1); 
     else { 
       $level_key = array_pop(array_reverse($arr)); 
       $sub_level = make_multi_level_array(
         array_slice($arr,1,count($arr)-1)  
       ); 
       return array(
         $level_key => $sub_level 
       ); 
     }  

} 
$arr = array(
    'level1' => 'someval', 
    'level2' => 'someotherval', 
    'level3' => 'thirdval', 
); 

var_dump(make_multi_level_array($arr)); 

将输出这样的:

array(1) { 
    ["someval"]=> 
    array(1) { 
    ["someotherval"]=> 
    array(1) { 
     ["thirdval"]=> 
     int(1) 
    } 
    } 
} 

也试过其他情况下,像下面。

$arr = array(
    'level1' => 'someval', 
    'level2' => 'someotherval', 
    'level3' => 'thirdval', 
    'level4' => 'fourthval' 
); 

看起来没问题:

array(1) { 
    ["someval"]=> 
    array(1) { 
    ["someotherval"]=> 
    array(1) { 
     ["thirdval"]=> 
     array(1) { 
     ["fourthval"]=> 
     int(1) 
     } 
    } 
    } 
}