在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' => 4, 'name' => 'Node 2.2'],
['id' => 7, 'parent_id' => 2, 'name' => 'Node 1.1.1'],
];
首先,我们可以通过过滤parent_id
为0
的节点来找出所有的根节点。
$roots = array_filter($nodes, function($node) {
return $node['parent_id'] == 0;
});
接下来,我们可以编写一个递归函数来遍历每个根节点的子孙节点。
function buildTree(array &$nodes, $parentId = 0) {
$branch = [];
foreach ($nodes as $node) {
if ($node['parent_id'] == $parentId) {
$children = buildTree($nodes, $node['id']);
if ($children) {
$node['children'] = $children;
}
$branch[] = $node;
}
}
return $branch;
}
$tree = buildTree($nodes);
最后,我们可以将结果输出或进一步处理。
print_r($tree);
$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' => 4, 'name' => 'Node 2.2'],
['id' => 7, 'parent_id' => 2, 'name' => 'Node 1.1.1'],
];
function buildTree(array &$nodes, $parentId = 0) {
$branch = [];
foreach ($nodes as $node) {
if ($node['parent_id'] == $parentId) {
$children = buildTree($nodes, $node['id']);
if ($children) {
$node['children'] = $children;
}
$branch[] = $node;
}
}
return $branch;
}
$tree = buildTree($nodes);
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
(
[0] => Array
(
[id] => 7
[parent_id] => 2
[name] => Node 1.1.1
)
)
)
[1] => Array
(
[id] => 3
[parent_id] => 1
[name] => Node 1.2
)
)
)
[1] => Array
(
[id] => 4
[parent_id] => 0
[name] => Node 2
[children] => Array
(
[0] => Array
(
[id] => 5
[parent_id] => 4
[name] => Node 2.1
)
[1] => Array
(
[id] => 6
[parent_id] => 4
[name] => Node 2.2
)
)
)
)
buildTree
函数通过递归的方式遍历每个节点,并将子节点放入children
数组中。$tree
数组包含了所有的根节点及其子孙节点。这种方法适用于大多数树形结构的遍历需求,并且可以根据实际情况进行扩展和优化。