插件窝 干货文章 PHP一维数组如何高效转换为复杂的多层嵌套数组?

PHP一维数组如何高效转换为复杂的多层嵌套数组?

数组 一维 parent 递归 502    来源:    2025-03-15

在PHP中,将一维数组转换为复杂的多层嵌套数组可以通过递归或迭代的方式实现。具体方法取决于你希望如何组织数据以及嵌套的规则。以下是一个常见的场景和解决方案:

场景描述

假设你有一个一维数组,数组中的每个元素都有一个 idparent_id 字段,表示元素的父子关系。你需要将这个一维数组转换为一个多层嵌套的树形结构。

示例数据

$items = [
    ['id' => 1, 'parent_id' => 0, 'name' => 'Root 1'],
    ['id' => 2, 'parent_id' => 1, 'name' => 'Child 1.1'],
    ['id' => 3, 'parent_id' => 1, 'name' => 'Child 1.2'],
    ['id' => 4, 'parent_id' => 2, 'name' => 'Grandchild 1.1.1'],
    ['id' => 5, 'parent_id' => 0, 'name' => 'Root 2'],
    ['id' => 6, 'parent_id' => 5, 'name' => 'Child 2.1'],
];

解决方案

我们可以通过递归的方式将一维数组转换为多层嵌套的树形结构。

function buildTree(array &$elements, $parentId = 0) {
    $branch = [];

    foreach ($elements as &$element) {
        if ($element['parent_id'] == $parentId) {
            $children = buildTree($elements, $element['id']);
            if ($children) {
                $element['children'] = $children;
            }
            $branch[] = $element;
            unset($element);
        }
    }
    return $branch;
}

$tree = buildTree($items);
print_r($tree);

解释

  1. buildTree 函数:这个函数接收两个参数,$elements 是原始的一维数组,$parentId 是当前处理的父节点ID,默认为0(表示根节点)。

  2. 遍历数组:函数内部遍历 $elements 数组,找到所有 parent_id 等于当前 $parentId 的元素。

  3. 递归调用:对于每个找到的元素,递归调用 buildTree 函数,将其 id 作为新的 $parentId,以查找其子节点。

  4. 构建树形结构:如果找到子节点,将其添加到当前元素的 children 数组中。

  5. 返回结果:最终返回构建好的树形结构。

输出结果

Array
(
    [0] => Array
        (
            [id] => 1
            [parent_id] => 0
            [name] => Root 1
            [children] => Array
                (
                    [0] => Array
                        (
                            [id] => 2
                            [parent_id] => 1
                            [name] => Child 1.1
                            [children] => Array
                                (
                                    [0] => Array
                                        (
                                            [id] => 4
                                            [parent_id] => 2
                                            [name] => Grandchild 1.1.1
                                        )

                                )

                        )

                    [1] => Array
                        (
                            [id] => 3
                            [parent_id] => 1
                            [name] => Child 1.2
                        )

                )

        )

    [1] => Array
        (
            [id] => 5
            [parent_id] => 0
            [name] => Root 2
            [children] => Array
                (
                    [0] => Array
                        (
                            [id] => 6
                            [parent_id] => 5
                            [name] => Child 2.1
                        )

                )

        )

)

优化建议

  • 性能优化:如果数据量非常大,可以考虑使用引用或缓存来减少递归调用的次数。
  • 灵活性:可以根据需要调整 idparent_id 的字段名,或者添加其他字段来丰富树形结构。

通过这种方式,你可以高效地将一维数组转换为复杂的多层嵌套数组。