在PHP中,处理树形结构的数据时,通常需要找出所有的根节点及其子孙节点。假设你有一个数组,其中每个元素代表一个节点,并且每个节点都有一个唯一的ID和一个指向其父节点的parent_id
。根节点的parent_id
通常为0
或null
。
以下是一个示例数组:
$nodes = [
['id' => 1, 'parent_id' => 0, 'name' => 'Node 1'],
['id' => 2, 'parent_id' => 1, 'name' => 'Node 1.1'],
['id' => 3, 'parent_id' => 1, 'name' => 'Node 1.2'],
['id' => 4, 'parent_id' => 0, 'name' => 'Node 2'],
['id' => 5, 'parent_id' => 4, 'name' => 'Node 2.1'],
['id' => 6, 'parent_id' => 5, 'name' => 'Node 2.1.1'],
['id => 7, 'parent_id' => 0, 'name' => 'Node 3'],
];
首先,我们需要找出所有的根节点。根节点的parent_id
通常为0
或null
。
$roots = array_filter($nodes, function($node) {
return $node['parent_id'] == 0;
});
接下来,我们需要递归地找出每个根节点的所有子孙节点。我们可以使用一个递归函数来实现这一点。
function findChildren($parentId, $nodes) {
$children = [];
foreach ($nodes as $node) {
if ($node['parent_id'] == $parentId) {
$node['children'] = findChildren($node['id'], $nodes);
$children[] = $node;
}
}
return $children;
}
$tree = [];
foreach ($roots as $root) {
$root['children'] = findChildren($root['id'], $nodes);
$tree[] = $root;
}
$tree
数组将包含所有的根节点及其子孙节点的树形结构。
print_r($tree);
输出结果将类似于:
Array
(
[0] => Array
(
[id] => 1
[parent_id] => 0
[name] => Node 1
[children] => Array
(
[0] => Array
(
[id] => 2
[parent_id] => 1
[name] => Node 1.1
[children] => Array
(
)
)
[1] => Array
(
[id] => 3
[parent_id] => 1
[name] => Node 1.2
[children] => Array
(
)
)
)
)
[1] => Array
(
[id] => 4
[parent_id] => 0
[name] => Node 2
[children] => Array
(
[0] => Array
(
[id] => 5
[parent_id] => 4
[name] => Node 2.1
[children] => Array
(
[0] => Array
(
[id] => 6
[parent_id] => 5
[name] => Node 2.1.1
[children] => Array
(
)
)
)
)
)
)
[2] => Array
(
[id] => 7
[parent_id] => 0
[name] => Node 3
[children] => Array
(
)
)
)
findChildren
函数递归地查找每个节点的子节点,并将它们添加到children
数组中。$tree
数组包含了所有的根节点及其子孙节点的树形结构。这种方法适用于大多数树形结构的遍历需求,并且可以根据实际情况进行调整。