如何有序扁平化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
相关产品推荐
相关产品推荐

