本文介绍一种不依赖类成员变量的纯递归方案,将深度嵌套的父子结构(如面包屑路径)安全、高效地展开为正序数组,避免副作用和状态污染。
在处理具有链式 all_parents 嵌套结构的数据(例如树形分类、组织架构或面包屑导航)时,常见的陷阱是借助类属性(如 $this->breadcrumb)作为全局累加器。这种方式虽简单,却破坏了函数的纯性:导致不可重入、难以单元测试、并发调用时存在状态污染风险。
理想的解决方案应满足:无外部状态依赖、输入决定输出、递归过程自包含。以下是重构后的推荐实现:
private function generateBreadcrumb($structure, array &$acc = []): array
{
// 递归终止:空结构直接返回当前累积结果(注意:此处不反转!)
if (!$structure) {
return $acc;
}
// 先递归处理父级(深度优先向根),再追加当前层 —— 实现自然正序
$this->generateBreadcrumb($structure['all_parents'] ?? null, $acc);
// 当前节点追加到末尾(此时父节点已先写入,保证 id:1 → id:5 的顺序)
$acc[] = [
'id' => $structure['id'],
'name' => $structure['name']
];
return $acc;
}
✅ 关键设计说明: