2013-01-03 45 views
0

假设我有一个一维阵列$arr像这样:如何从循环创建树状数组?

Array 
(
    ['key1'] => 1 
    ['key2'] => 1 
    ['key3'] => 1 
    ['key4'] => 1 
) 

欲循环通过$arr这样的:

foreach($arr as $key => $a) { 
    //$tree[????] = ????? Here is my concern 
} 

使得,做print_r($tree)产生

Array 
(
    ['key1'] => Array 
    (
     ['key2'] => Array 
     (
      ['key3'] => Array 
      (
       ['key4'] => 1 
      ) 
     ) 
    ) 
) 

我关心的是如何增加循环f内的数组$tree的尺寸(不是值)从单维数组$numbers这样$tree['key1']['key2']['key3']是一个数组而$tree['key1']['key2']['key3']['key4']等于1

此外,如果我有一个单维数组$foo与10个元素。我应该生成另一个数组$bar,它扩展到与上面的输出类似的10维数组。

我应该在foreach循环内做些什么?或者,而不是使用循环,有没有办法从一维数组产生像上面那样的输出?


编辑:

确定好你显然需要某种形式的递归函数,但可以 你能解释一下你怎么知道KEY2应该为key1的孩子,KEY3 应该是一个孩子key2等基于你显示的数据?

1D数组的下一个元素是前一个元素的子元素。因此,如果一维数组是这样的:

Array 
(
    ['bar'] => 1 // I don't care of the values as of the moment 
    ['foo'] => 1 
    ['baz'] => 1 
) 

foo应该是bar的孩子,和元素baz应该是foo的树阵的孩子。

好吧所以除了最后一个元素的所有东西的实际值都是 不相关?

实际上,1D数组的所有值都与此刻无关。我只关心构建树型数组。

+1

确定好你显然需要某种形式的递归函数的,但你能解释一下你怎么知道'key2'应该是'一个孩子根据你显示的数据,key1','key3'应该是'key2'的一个孩子吗? – DaveRandom

+0

Hi @DaveRandom。请参阅修改。 –

+0

好吧,除了最后一个元素之外的所有东西的实际值是不相关的? – DaveRandom

回答

3

这样做的方法是使用引用。

function create_tree($arr) { 
    $result = array(); 
    $ref = &$result; 
    foreach ($arr as $key => $el) { 
    $ref = array($key => $el); 
    $ref =& $ref[$key]; 
    } 
    return $result; 
} 

工作原理:

$result = array(); // an array to hold the result 

$ref = &$result; // start with a reference to the top level 

foreach ($arr as $key => $el) { // iterate over the input array 

    $ref = array($key => $el); // create this level in the array 

    $ref =& $ref[$key]; // change the reference to be the new deepest level 

} 

return $result; // return the result 

See it working

+0

这工作得很好。谢谢。我从来没有想过参考。 –

2

Assignment by reference似乎对此有用。

$tree = array(); 
$node =& $tree; 
foreach ($arr as $key => $a) { 
    $node =& $node[$key]; 
    $node = array(); 
} 
$node = end($arr); 
+0

是的,或者也是做这项工作。 – DaveRandom