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

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

parent Node 节点 id 792    来源:    2025-03-11

在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' => 4, 'name' => 'Node 2.2'],
    ['id' => 7, 'parent_id' => 2, 'name' => 'Node 1.1.1'],
];

1. 找出所有根节点

首先,我们可以通过过滤parent_id0的节点来找出所有的根节点。

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

2. 递归遍历子孙节点

接下来,我们可以编写一个递归函数来遍历每个根节点的子孙节点。

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);

3. 输出结果

最后,我们可以将结果输出或进一步处理。

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

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