我有一个多维数组,我想为多维数组中的每个数组添加一个键和值。该值必须是多维阵列内数组的深度的水平。
例如:
Array(
[0] Array
(
[id] 1
[parentid] null
[0] Array
(
[id] 101
[parentid] 1
[1] Array
(
[id] 2
[parentid] null
[0] Array
(
[id] 161
[parentid] 2
[children] Array
(
[0] Array
(
[id] 300
[parentid] 161
)
预期输出:
Array(
[0] Array
(
[id] 1
[parentid] null
[level] 1
[0] Array
(
[id] 101
[parentid] 1
[level] 2
[1] Array
(
[id] 2
[parentid] null
[level] 1
[0] Array
(
[id] 161
[parentid] 2
[level] 2
[children] Array
(
[0] Array
(
[id] 300
[parentid] 161
[level] 3
)
您基本上想将递归函数与参考一起使用。
通过在其前面使用&
的参数&$foo
,您将其指定为对该对象的引用。
在数组的情况下,它不会制作修改的副本,而是对原始传递数组进行修改。
编辑在评论中添加了Yoshi的建议,以将&value
作为参考。
看到它直播:https://ideone.com/nhkabf
<?php
$array = [
'hello' => 'world',
'doing' => [
'hello' => 'universe',
'going' => [
'hello' => 'existence'
],
'moving' => [
'answer' => 42,
]
]
];
function levelUp(&$array, $level = 1)
// ^-- See that one? that's the magic.
{
$array['level'] = $level;
foreach($array as $key => &$value) {
// ^-- important to add that & here too
if(is_array($value)) {
levelUp($value, $level + 1);
}
}
}
levelUp($array);
var_dump($array);
function buildTree(array $elements, $parentId = 0) {
$branch = array();
foreach ($elements as $element) {
if ($element['parent_id'] == $parentId) {
$children = buildTree($elements, $element['id']);
if ($children) {
$element['children'] = $children;
}
$branch[] = $element;
}
}
return $branch;
}
$tree = buildTree($rows);
我不知道它是否相关,但是为什么不使用bluem/tree之类的库呢?
它具有用于此类问题的功能。
// Get a node's ID
$id = $node->getId();
// Get the node's hierarchical level (1-based)
$level = $node->getLevel();