
本文介绍如何使用递归方法将嵌套的多级树形数组(含 nodes 子节点)扁平化为一维关联数组,键为 id、值为带层级缩进的 text(如 lvl=1 前缀 1 个空格,lvl=2 前缀 2 个空格),并提供可直接复用的健壮实现。
本文介绍如何使用递归方法将嵌套的多级树形数组(含 `nodes` 子节点)扁平化为一维关联数组,键为 `id`、值为带层级缩进的 `text`(如 lvl=1 前缀 1 个空格,lvl=2 前缀 2 个空格),并提供可直接复用的健壮实现。
在 PHP 开发中,常需将具有嵌套结构的菜单、分类或导航树(如含 nodes 键的递归数组)转换为扁平的键值映射,尤其用于下拉选择框、面包屑生成或后台管理界面的快速检索。关键需求不仅是提取 id => text,还需保留层级语义——即通过前置空格数量直观反映节点深度(lvl 值),这对用户体验和数据可读性至关重要。
以下是一个简洁、高效且可扩展的递归扁平化方案:
/**
* 将树形数组扁平化为 id => indented_text 的关联数组
* @param array $tree 输入的嵌套树数组
* @param int $level 当前层级(默认为 1,对应顶层节点)
* @return array 扁平化后的 [id => ' Text'] 数组
*/
function flattenTreeWithIndent(array $tree, int $level = 1): array
{
$result = [];
$indent = str_repeat(' ', $level); // 每层对应 level 个空格
foreach ($tree as $node) {
// 确保必要字段存在,避免 Notice 错误
if (!isset($node['id'], $node['text'])) {
continue;
}
// 映射:id => 缩进后的文本
$result[$node['id']] = $indent . $node['text'];
// 递归处理子节点(若存在),层级 +1
if (isset($node['nodes']) && is_array($node['nodes']) && !empty($node['nodes'])) {
$result += flattenTreeWithIndent($node['nodes'], $level + 1);
}
}
return $result;
}✅ 使用示例:
$tree = [
[
'id' => '2',
'parent_id' => '1',
'text' => 'Algoritma',
'lvl' => '1',
'nodes' => [
['id' => '11', 'text' => 'Flowchart', 'lvl' => '2', 'href' => '/site/read-by-type?id=11'],
['id' => '12', 'text' => 'Pseudo code', 'lvl' => '2', 'href' => '/site/read-by-type?id=12']
],
'href' => '/site/read-by-type?id=2'
],
[
'id' => '3',
'text' => 'Pemrograman',
'lvl' => '1',
'nodes' => [
['id' => '4', 'text' => 'Java', 'lvl' => '2'],
[
'id' => '5',
'text' => 'PHP',
'lvl' => '2',
'nodes' => [
['id' => '8', 'text' => 'Yii2 Framework', 'lvl' => '3'],
['id' => '9', 'text' => 'Laravel', 'lvl' => '3']
]
]
]
]
];
$flattened = flattenTreeWithIndent($tree);
print_r($flattened);? 输出效果(部分):
立即学习“PHP免费学习笔记(深入)”;
[ "2" => " Algoritma", "11" => " Flowchart", "12" => " Pseudo code", "3" => " Pemrograman", "4" => " Java", "5" => " PHP", "8" => " Yii2 Framework", "9" => " Laravel" ]
⚠️ 注意事项:
- 函数严格依赖 lvl 字段或逻辑层级计数(本实现采用后者,更鲁棒——即使 lvl 字段缺失或错误,仍能按实际嵌套深度缩进);
- 使用 += 合并数组时已确保键唯一性(id 作为天然主键),无需额外去重;
- 对空 nodes 或缺失字段做防御性检查,避免运行时警告;
- 若需兼容 PHP < 7.1,请将返回类型声明 : array 移除;
- 如需支持自定义缩进字符(如 或 —),可将 $indent 改为参数传入。
该方案兼具可读性、健壮性与实用性,可无缝集成至 Laravel、Yii2 等框架的服务类中,是处理树形数据标准化输出的推荐实践。



















