
本文介绍一种递归算法,将“自底向上”的嵌套父链(parent 指向祖先)结构,转换为“自顶向下”的子树结构(child 指向后代),实现数组的镜像翻转。
本文介绍一种递归算法,将“自底向上”的嵌套父链(parent 指向祖先)结构,转换为“自顶向下”的子树结构(child 指向后代),实现数组的镜像翻转。
在实际开发中,我们常遇到数据以“反向链表”形式组织:每个节点通过 parent 指向上级,最深层节点的 parent 为 null(如家族树中“ youngest → parent → grandparent”)。但前端渲染、树形组件或业务逻辑往往需要正向结构——即每个节点通过 child 指向直接下级。此时,需对原始结构做递归镜像转换:从最深的祖先开始,逐层包裹,构建出以最早祖先为根、逐级展开后代的新树。
以下是一个健壮、可读性强的 PHP 递归实现:
function mirror(?array $array, array $subArray = []): array
{
// 递归终止条件:到达最顶层(原结构中 parent === null)
if ($array === null) {
return $subArray;
}
$name = $array['name'];
$parent = $array['parent'];
// 初始调用时,$subArray 为空,先构建最深层节点(即最终的根节点)
if (empty($subArray)) {
return mirror($parent, [
'name' => $name,
'child' => null
]);
}
// 将当前节点作为新父节点,把已构建的子树作为其 child
$subArray = [
'name' => $name,
'child' => $subArray
];
return mirror($parent, $subArray);
}
使用示例:
$demo = [
'name' => 'name 3',
'parent' => [
'name' => 'name 2',
'parent' => [
'name' => 'name 1',
'parent' => null
]
]
];
$mirrored = mirror($demo);
print_r($mirrored);
// 输出:
// Array(
// [name] => name 1
// [child] => Array(
// [name] => name 2
// [child] => Array(
// [name] => name 3
// [child] => NULL
// )
// )
// )
✅ 关键设计说明:
- 函数采用尾递归思想,不依赖栈深度回溯,而是通过累积参数
$subArray逐步构建结果; - 初始空
$subArray触发首层“探底”,确保name 1成为新树根; - 每次递归返回前,将当前节点包装为外层容器,原
$subArray变为其child,实现“由内而外”的翻转。
⚠️ 注意事项:
- 输入必须是严格符合该嵌套格式的关联数组(含
name和parent键),否则需提前校验; - 若原始结构存在环引用或深度过大,可能引发栈溢出——生产环境建议增加递归深度限制或改用迭代(栈模拟)实现;
- 如需支持多子节点(即原结构为树而非单链),则需重构逻辑以聚合所有兄弟节点,本例仅处理单链镜像场景。
该方案简洁高效,是处理线性嵌套父子关系反转的经典递归范式。










