
本文介绍在 PHP 中将具有嵌套 children 键的树形数组递归扁平化为线性数组的方法,保持父子层级顺序(深度优先),并剔除冗余的 children 子数组。
本文介绍在 php 中将具有嵌套 `children` 键的树形数组递归扁平化为线性数组的方法,保持父子层级顺序(深度优先),并剔除冗余的 `children` 子数组。
在实际开发中(如菜单、分类、组织架构等场景),常需将多层嵌套的树形结构转换为便于遍历、渲染或存储的一维数组。关键要求是:保持访问顺序(通常为深度优先)、保留节点原始字段(如 id、parent、name),同时移除 children 键及其子树。
以下是一个简洁、健壮的递归实现:
<?php function flattenTree(array $tree, array &$result = []): array
{
foreach ($tree as $node) {
// 复制节点并移除 children 字段(避免修改原数组)
$flatNode = $node;
unset($flatNode['children']);
$result[] = $flatNode;
// 若存在子节点,则递归处理
if (isset($node['children']) && is_array($node['children'])) {
flattenTree($node['children'], $result);
}
}
return $result; // 支持链式调用或明确返回
}
// 使用示例
$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);
✅ 输出结果(严格按深度优先顺序):
Array
(
[0] => Array ( [id] => 1360 [parent] => 0 [name] => main A )
[1] => Array ( [id] => 1361 [parent] => 1360 [name] => sub a1 )
[2] => Array ( [id] => 57 [parent] => 1360 [name] => sub a2 )
[3] => Array ( [id] => 10 [parent] => 0 [name] => Main B )
)
⚠️ 注意事项:
- 避免引用陷阱:函数使用 &$result 引用传参提升性能,但调用时建议初始化空数组(如 $result = []),或改用返回值方式(如上例所示)以增强可测试性与函数纯度。
- 健壮性增强:添加 is_array() 检查,防止 children 为非数组类型(如 null 或字符串)导致 foreach 报错。
- 非递归替代方案:对极深树结构,可考虑栈模拟迭代(避免 PHP 默认递归深度限制),但本例中递归清晰直观,适用于绝大多数业务场景。
- 扩展性提示:如需保留层级深度(level 字段)或路径(path),可在递归时传入当前深度参数并写入 $flatNode。
该方法逻辑清晰、无外部依赖,可直接集成至 Laravel、Symfony 等框架的数据预处理流程中,是 PHP 树形结构扁平化的标准实践之一。











