假设我有一个像这样的一维数组$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阵列的所有值在此时都无关紧要。我只关心构造树数组。
答案 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
答案 1 :(得分:2)
Assignment by reference似乎对此有用。
$tree = array();
$node =& $tree;
foreach ($arr as $key => $a) {
$node =& $node[$key];
$node = array();
}
$node = end($arr);