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
            )
        )
    )
)

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

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

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


编辑:

好吧,您显然需要某种递归函数,但是您能否根据您显示的数据解释如何知道 key2 应该是 key1 的孩子,key3 应该是 key2 的孩子等?

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

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

Elementfoo应该是 的子级bar,并且 elementbaz应该是foo树数组的子级。

好的,所以除了最后一个元素之外的所有东西的实际值都无关紧要吗?

实际上,到目前为止,一维数组的所有值都无关紧要。我只关心构建树数组。

4

2 回答 2

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

看到它工作

于 2013-01-03T11:09:17.527 回答
2

引用分配似乎对此很有用。

$tree = array();
$node =& $tree;
foreach ($arr as $key => $a) {
    $node =& $node[$key];
    $node = array();
}
$node = end($arr);
于 2013-01-03T11:05:18.127 回答