插件窝 干货文章 PHP树形数组遍历:如何找出所有根节点及其子孙节点?

PHP树形数组遍历:如何找出所有根节点及其子孙节点?

节点 parent Node children 923    来源:    2025-03-13

在PHP中,处理树形结构的数据时,通常需要找出所有的根节点及其子孙节点。假设你有一个数组,其中每个元素代表一个节点,并且每个节点都有一个唯一的ID和一个指向其父节点的parent_id。根节点的parent_id通常为0null

以下是一个示例数组:

$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'],
];

步骤1:找出所有根节点

首先,我们需要找出所有的根节点。根节点的parent_id通常为0null

$roots = array_filter($nodes, function($node) {
    return $node['parent_id'] == 0;
});

步骤2:递归遍历子孙节点

接下来,我们需要递归地找出每个根节点的所有子孙节点。我们可以使用一个递归函数来实现这一点。

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数组包含了所有的根节点及其子孙节点的树形结构。

这种方法适用于大多数树形结构的遍历需求,并且可以根据实际情况进行调整。