如何从循环创建树状数组?

时间:2013-01-03 10:43:53

标签: php loops

假设我有一个像这样的一维数组$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
            )
        )
    )
)

我关心的是如何从单维数组$tree增加循环内数组$numbers的维度(而不是值),以使$tree['key1']['key2']['key3']是一个数组而$tree['key1']['key2']['key3']['key4'] 1}}等于1

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

我应该在foreach循环中做什么?或者不是使用循环,有没有办法从一维数组生成类似上面的输出?


编辑:

  

好吧,你显然需要某种递归功能,但可以   你解释了你怎么知道key2应该是key1,key3的孩子   应该是key2等的孩子,基于你显示的数据?

1D数组的下一个元素是前一个元素的子元素。所以如果1D数组是这样的:

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

元素foo应该是bar的子元素,元素baz应该是树数组的foo的子元素。

  

好的,除了最后一个元素之外的所有内容的实际值都是   不相关?

实际上,1D阵列的所有值在此时都无关紧要。我只关心构造树数组。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

Assignment by reference似乎对此有用。

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