首先获取嵌套树的子项

时间:2016-06-25 05:14:40

标签: php laravel laravel-5 laravel-5.2

我有一张表(让我们称之为entries),如下所示:

id  parent_id
1   0
2   1
3   2
4   1
5   4
6   5
7   4
8   1

作为一棵树,它看起来像这样(数字是id):

- 1
    - 2
        - 3
    - 4
        - 5
            - 6
        - 7
    - 8

我希望从最内层的孩子开始获取这些ID的数组,然后继续努力。

输出应为:

[3, 2, 6, 5, 7, 4, 8, 1]

我正在使用Laravel 5.2

1 个答案:

答案 0 :(得分:1)

您尝试做的事情称为depth first in order traversal。它可以通过递归迭代每个父节点的叶节点来完成,直到你到达一个没有叶子的节点。

根据您用于在PHP中存储此数据的数据结构,方法可能会有所不同。例如,使用数组(,如下例中的那个)可能看起来像这样......

$tree = [
    1 => [
        2 => [
            3 => [],
        ],
        4 => [
            5 => [
                6 => [],
            ],
            7 => [],
        ],
        8 => [],
    ]
];


function depthFirstTraversal(Array $nodes) {
    foreach($nodes as $node => $children) {
        if (!$children) {
            return $node;
        }
        echo depthFirstTraversal($children);
        echo $node;
    }
}

depthFirstTraversal($tree);

//Output would be 32657481

您也可以对对象执行相同的操作,其中对象将节点值和子数组指定为属性,而不是使用数组键作为父节点,子项作为其值如上所述。