【问题标题】:Using buildTree to generate array of all possible branches使用 buildTree 生成所有可能分支的数组
【发布时间】:2018-07-09 10:03:32
【问题描述】:

我正在使用此处的 buildTree 函数来获取父级的所有子级,但我正在努力调整代码以在树中生成所有可能的分支。

样本数据:

Array
(
    [0] => Array
        (
            [id] => 7
            [parent_id] => 6
        )

    [1] => Array
        (
            [id] => 8
            [parent_id] => 6
        )

    [2] => Array
        (
            [id] => 17
            [parent_id] => 7
        )

    [3] => Array
        (
            [id] => 18
            [parent_id] => 7
        )

    [4] => Array
        (
            [id] => 20
            [parent_id] => 17
        )

    [5] => Array
        (
            [id] => 21
            [parent_id] => 17
        )

    [6] => Array
        (
            [id] => 22
            [parent_id] => 17
        )
)

构建树:

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;
    }
}

我要输出的内容:

Array
(
    [0] => Array
        (
            6, 7, 17, 20
        )

    [1] => Array
        (
            6, 7, 17, 21
        )

    [2] => Array
        (
            6, 7, 17, 22
        )

    [3] => Array
        (
            6, 7, 18
        )

    [4] => Array
        (
            6, 8
        )
)

我尝试使用 foreach 循环而不是 if($children) 来生成结果数组中的下一个键,并从树的更高层合并现有数据,但没有成功。

非常感谢任何帮助!

【问题讨论】:

    标签: php arrays recursion


    【解决方案1】:

    好吧,在您的 buildTree 函数中有几个错误。首先,您不能检查数组中不存在的键,例如“parent”(有“parent_id”)。

    请检查这是否是您要查找的内容:

    <?php
    
    $input =
    [
      [
        "id" => 7,
        "parent_id" => 6
      ],
      [
        "id" => 8,
        "parent_id" => 6
      ],
      [
        "id" => 17,
        "parent_id" => 7
      ],
      [
        "id" => 18,
        "parent_id" => 7
      ],
      [
        "id" => 20,
        "parent_id" => 17
      ],
      [
        "id" => 21,
        "parent_id" => 17
      ],
      [
        "id" => 22,
        "parent_id" => 17
      ]
    ];
    
    function buildTree(array $elements, $parentId = 0)
    {
        $branch = array();
        foreach ($elements as $element) {
            if ($element['parent_id'] == $parentId) {
                $children = buildTree($elements, $element['id']);
                if (!empty($children)) {
                    $element['children'] = $children;
                }
                $branch[] = $element;
            }
        }
        return $branch;
    }
    
    print_r(buildTree($input, 7));
    

    【讨论】:

    • 谢谢卡罗尔。 “父母”是一个错字,现在更正。我的 buildTree 在生成嵌套数组方面表现出色,但我需要对其进行调整以生成通过树向下的每个可能路线的数组。
    猜你喜欢
    • 2022-01-18
    • 1970-01-01
    • 2019-04-06
    • 2016-08-16
    • 2016-01-07
    相关资源
    最近更新 更多