本文介绍一种不依赖类成员变量的纯递归方式,将嵌套的父子结构数组(如面包屑路径)转换为正序排列的扁平数组,通过引用传递或返回值累积结果,提升代码可测试性与线程安全性。
在处理树形嵌套结构(如带 all_parents 的层级数据)时,常见的陷阱是依赖类属性(如 $this->breadcrumb)作为递归过程中的“累加器”。这不仅破坏了函数的纯度,还导致不可重入、难以单元测试,且在并发或递归调用多个实例时易引发状态污染。
✅ 推荐方案一:引用传参 + 顶层反转(简洁实用)
private function generateBreadcrumb($structure, &$output = []): array
{
if (!empty($structure)) {
$output[] = [
'id' => $structure['id'],
'name' => $structure['name'],
];
$this->generateBreadcrumb($structure['all_parents'] ?? null, $output);
}
return array_reverse($output);
}
⚠️ 注意:array_reverse() 仅在最外层调用返回前执行一次,而非每次递归都调用,避免性能浪费。&$output 确保所有递归层级共享同一数组引用,最终由顶层统一反转,得到从根(ID=1)到当前节点(ID=5)的正序列表。
✅ 推荐方案二:无副作用纯函数式(推荐进阶用法)
若追求完全无状态、可预测的纯函数,可改用“自底向上”构建——让每次递归返回其子路径,再拼接当前项: