
本文介绍一种递归方式将嵌套的树形 php 数组(含 children 子数组)扁平化为一维索引数组,保持父子层级顺序,同时移除 children 键,适用于菜单、分类等场景。
本文介绍一种递归方式将嵌套的树形 php 数组(含 children 子数组)扁平化为一维索引数组,保持父子层级顺序,同时移除 children 键,适用于菜单、分类等场景。
在实际开发中,我们常遇到以 children 键组织的多级树形数据(如商品分类、导航菜单),但某些场景(如数据库批量插入、前端扁平渲染、导出 CSV)需要将其转换为线性结构。关键要求是:保持遍历顺序(通常为深度优先)、剔除 children 子数组、保留每个节点的原始字段(如 id、parent、name)。
以下是一个简洁、健壮的递归实现:
<?php function flattenTree(array $tree, array &$results = []): array
{
foreach ($tree as $node) {
// 复制节点并移除 children 键(避免修改原数组)
$flattenedNode = $node;
unset($flattenedNode['children']);
$results[] = $flattenedNode;
// 若存在子节点,则递归处理
if (isset($node['children']) && is_array($node['children'])) {
flattenTree($node['children'], $results);
}
}
return $results;
}
// 使用示例
$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'
]
];
$flattened = flattenTree($categoryTree);
print_r($flattened);
?>
✅ 输出结果符合预期:
- 索引 0 → id=1360(根节点 main A)
- 索引 1 → id=1361(其子节点 sub a1)
- 索引 2 → id=57(其子节点 sub a2)
- 索引 3 → id=10(另一根节点 Main B)
? 注意事项与优化建议:
- 安全性:函数使用 is_array() 显式校验 children 类型,防止非数组值触发警告;
- 不可变性:通过 $node 复制而非直接操作原数组,保障输入数据完整性;
- 可扩展性:若需保留层级深度(level)或路径(path),可在递归调用时传入 $depth 参数并写入结果;
- 性能提示:对超大规模树(>10,000 节点),可考虑改用栈模拟递归(避免 PHP 默认递归深度限制),但本例中递归方案更直观易维护。
该方法以最小侵入性完成结构转换,兼顾可读性与实用性,是 PHP 树形数据扁平化的标准实践之一。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











