我有一棵巨大的动态生成的树。该树是根据每个元素“ parent_id”属性从平面数组生成的。
例如,最终结果将如下所示:
Array
(
[0] => Array
(
[id] => 70
[name] => Top Corp
[parent_id] => 0
[children] => Array
(
[0] => Array
(
[id] => 43
[name] => Department
[parent_id] => 70
[children] => Array
(
[0] => Array
(
[id] => 45
[name] => Building
[parent_id] => 43
[children] => Array
(
[0] => Array
(
[id] => 75
[name] => Office
[parent_id] => 45
)
)
)
如何仅提取阵列树的一部分?我应该看什么功能或方法?
例如我该怎么说另一个子级别(可能深20-30个级别)现在位于顶部。
例如,sliceTree(45)
的伪函数应产生以下结果,也就是从id 45
开始树
[0] => Array
(
[id] => 45
[name] => Building
[parent_id] => 43
[children] => Array
(
[0] => Array
(
[id] => 75
[name] => Office
[parent_id] => 45
)
)
)
没有办法知道树可以走多深,因此它的解决方案需要递归。
我试图循环数组,寻找起始ID,但是我不确定在找到该点之后如何继续执行。
我提出的解决方案如下
function sliceTree($tree, $id){
$ret = [];
foreach ($tree as $out) {
// if the top level matches
if($out["id"] == $id){
array_push($ret, $out);
}
else {
if(isset($out["children"])){
foreach ($out["children"] as $c) {
if($c["id"] == $id){
array_push($ret, $c);
}
// probably needs to call itself here
}
}
}
}
return $ret;
}
这有效,但仅适用于顶级元素。我该如何递归并解释儿童的多个层次?
答案 0 :(得分:3)
sliceTree()
函数基本上会寻找某个id
并将其返回。像这样:
function sliceTree($tree, $branchId)
{
// check all branches
foreach ($tree as $branch) {
// have we found the correct branch?
if ($branch['id'] == $branchId) return $branch;
// check the children
if (isset($branch['children'])) {
$slice = sliceTree($branch['children'], $branchId);
if (isset($slice)) return $slice;
}
}
// nothing was found
return null;
}
如您所见,该例程是递归的。 代码未经测试。
我对混合隐喻感到抱歉:分支机构和子级,但是您是从头开始的。
此功能比我希望的要复杂一些,因为在您的示例中,当没有子代时,children
键不存在。我通常希望它在那里,并且值是一个空数组。