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

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

数组 递归 一维 parent 190    来源:    2025-03-13

在PHP中,将一维数组转换为复杂的多层嵌套数组可以通过递归或迭代的方式来实现。具体的方法取决于你想要的多层嵌套结构。以下是一个常见的场景:将一维数组转换为树形结构。

示例场景

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

示例代码

<?php

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

// 示例一维数组
$flatArray = [
    ['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' => 2, 'name' => 'Node 1.1.1'],
    ['id' => 5, 'parent_id' => 0, 'name' => 'Node 2'],
    ['id' => 6, 'parent_id' => 5, 'name' => 'Node 2.1'],
];

$tree = buildTree($flatArray);

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] => 4
                                            [parent_id] => 2
                                            [name] => Node 1.1.1
                                        )

                                )

                        )

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

                )

        )

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

                )

        )

)

代码解释

  1. buildTree 函数:这是一个递归函数,用于构建树形结构。它接受两个参数:$elements 是原始的一维数组,$parentId 是当前处理的父节点ID。
  2. 遍历数组:函数遍历数组中的每个元素,检查其 parent_id 是否等于当前的 $parentId。如果是,则将该元素添加到当前分支中,并递归调用 buildTree 函数来查找其子节点。
  3. 递归终止条件:当没有更多的子节点时,递归终止。
  4. unset($element):在将元素添加到分支后,使用 unset 将其从原始数组中移除,以避免重复处理。

性能优化

  • 索引优化:如果数组非常大,可以考虑先对数组进行索引(例如,按 parent_id 进行分组),以减少每次查找子节点的时间复杂度。
  • 迭代替代递归:对于非常深的嵌套结构,递归可能会导致栈溢出。在这种情况下,可以考虑使用迭代(如栈或队列)来替代递归。

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