PHP如何将嵌套树形多维数组递归展平为指定格式二维数组
现有方案错误原因
你当前使用array_walk_recursive实现的扁平化函数不符合需求,因为array_walk_recursive会递归遍历所有底层字段值(比如id、name的具体内容),而非将每个嵌套的节点数组作为整体保留,最终返回的是零散字段值组成的一维数组,和预期结果不符。
正确实现方案
核心逻辑采用深度优先遍历处理树形结构:
- 遍历每个节点时,先单独提取
children字段用于后续递归处理 - 移除当前节点的
children字段后,将节点加入结果数组 - 递归处理当前节点的所有子节点,将子节点的展平结果合并到总结果中
实现代码如下:
private function flatten_array(array $nodes): array { $result = []; foreach ($nodes as $node) { // 提取子节点列表用于后续递归 $children = $node['children'] ?? []; // 移除不需要的children字段 unset($node['children']); $result[] = $node; // 递归处理子节点并合并结果 if (!empty($children)) { $result = array_merge($result, $this->flatten_array($children)); } } return $result; }
使用说明
如果你的输入是单个根节点(如你示例中的结构),调用时需要先将根节点包裹为数组再传入函数:
// 假设$root是你存储的根节点数据 $flattenedResult = $this->flatten_array([$root]);
执行后得到的$flattenedResult就是你需要的无children字段的一维数组,节点顺序和层级遍历逻辑一致,父节点在前,对应子节点紧随其后。
内容的提问来源于stack exchange,提问作者alexmorgan.cr
相关产品推荐
相关产品推荐

