You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何有序扁平化PHP树形数组 保持父前子后遍历顺序

PHP 嵌套树形数组转父节点优先的一维扁平化数组

需求说明

现有多层级嵌套的分类树形数组,节点通过children字段挂载子节点,需要将其转换为一维数组,要求:

  • 父节点始终排在自身所有子节点之前
  • 同层级节点保持原数组的排列顺序
  • 输出结果移除冗余的children字段,仅保留节点基础属性

示例输入结构:

$categoryTree = [
    0 => [
        'id' => 1360,
        'parent' => 0,
        'name' => 'main A',
        'children' => [
            0 => [
                'id' => 1361,
                'parent' => 1360,
                'name' => 'sub a1'
            ],
            1 => [
                'id' => 57,
                'parent' => 1360,
                'name' => 'sub a2'
            ]
        ]
    ],
    1 => [
        'id' => 10,
        'parent' => 0,
        'name' => 'Main B'
    ]
];

目标输出结构:

$categoryTree = [
    0 => [
        'id' => 1360,
        'parent' => 0,
        'name' => 'main A'
    ],
    1 => [
        'id' => 1361,
        'parent' => 1360,
        'name' => 'sub a1'
    ],
    2 => [
        'id' => 57,
        'parent' => 1360,
        'name' => 'sub a2'
    ],
    3 => [
        'id' => 10,
        'parent' => 0,
        'name' => 'Main B'
    ]
];

实现代码

采用深度优先递归遍历实现,逻辑简单且支持任意层级的嵌套结构:

function flattenCategoryTree(array $tree): array
{
    $flatList = [];
    foreach ($tree as $node) {
        // 提前提取子节点,避免修改原节点影响后续逻辑
        $childNodes = $node['children'] ?? [];
        // 移除children字段,保留节点基础属性
        unset($node['children']);
        // 先将当前父节点存入结果集
        $flatList[] = $node;
        // 存在子节点则递归处理,将子节点顺序追加到当前节点之后
        if (!empty($childNodes)) {
            array_push($flatList, ...flattenCategoryTree($childNodes));
        }
    }
    return $flatList;
}

// 调用示例
$result = flattenCategoryTree($categoryTree);

逻辑说明

  • 遍历遵循深度优先规则,每访问一个节点优先处理节点自身,再递归处理其子节点,天然满足父节点在前的排序要求
  • 遍历过程完全沿用原数组的键顺序,不会打乱同层级节点的原有排列
  • 支持任意深度的嵌套结构,三级、四级等更深层级的子分类无需调整代码即可正常转换
  • 传入示例数据执行后,输出结果和目标结构完全匹配。

内容的提问来源于stack exchange,提问作者ilhan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 21:45:39