我有一张表(让我们称之为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。
答案 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
您也可以对对象执行相同的操作,其中对象将节点值和子数组指定为属性,而不是使用数组键作为父节点,子项作为其值如上所述。