如何使用PHP提取多维数组树的一部分

时间:2019-05-04 07:57:19

标签: php arrays

我有一棵巨大的动态生成的树。该树是根据每个元素“ 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;
}

这有效,但仅适用于顶级元素。我该如何递归并解释儿童的多个层次?

1 个答案:

答案 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键不存在。我通常希望它在那里,并且值是一个空数组。