
本文介绍一种递归算法,将“自底向上”的嵌套父引用结构(如 parent 链)转换为“自顶向下”的子节点结构(如 child 链),适用于树形数据的逆向重构。
本文介绍一种递归算法,将“自底向上”的嵌套父引用结构(如 `parent` 链)转换为“自顶向下”的子节点结构(如 `child` 链),适用于树形数据的逆向重构。
在实际开发中,我们常遇到以“反向链表”形式组织的树结构:每个节点通过 parent 指向上级,最顶层节点的 parent 为 null。但前端渲染、序列化或某些算法逻辑往往需要标准的正向树结构——即每个节点通过 child 指向其直接下级。这种结构转换即所谓“镜像”(mirroring)。
核心思路是:递归深入到最深层(parent === null),然后自底向上逐层构建新结构。每回溯一层,就将当前节点的 name 作为新节点,将其已构建好的子树作为 child 值,从而自然形成由老到新、由根到叶的正向链。
以下是实现该逻辑的健壮 PHP 函数:
function mirror(?array $array, array $subArray = []): array
{
// 终止条件:到达原始链末端(无父节点)
if ($array === null) {
return $subArray;
}
$name = $array['name'] ?? '';
$parent = $array['parent'] ?? null;
// 初始调用时,$subArray 为空,先初始化最深层节点(即原始结构中最老的节点)
if (empty($subArray)) {
return mirror($parent, [
'name' => $name,
'child' => null
]);
}
// 将当前节点包裹为新节点,并将已构建的子树作为其 child
return mirror($parent, [
'name' => $name,
'child' => $subArray
]);
}使用示例:
$demo = [
'name' => 'name 3',
'parent' => [
'name' => 'name 2',
'parent' => [
'name' => 'name 1',
'parent' => null
]
]
];
$mirror = mirror($demo);
print_r($mirror);
// 输出:
// Array (
// [name] => name 1
// [child] => Array (
// [name] => name 2
// [child] => Array (
// [name] => name 3
// [child] => NULL
// )
// )
// )⚠️ 注意事项:
- 输入数组必须严格遵循
'name'+'parent'键名约定,且parent值为null或关联数组; - 函数不校验键是否存在,生产环境建议添加
isset()或array_key_exists()安全检查; - 若需支持多叉树(即一个节点有多个子节点),此算法需扩展为迭代收集所有兄弟节点,当前仅适用于单链式线性树(即每个节点至多一个
parent和一个隐式child); - 递归深度受限于 PHP 的内存与栈限制,超深结构建议改用迭代+显式栈实现。
总结:该镜像转换本质是链表翻转的思想在嵌套数组中的体现。掌握“先探底、再回填”的递归模式,可灵活应对各类方向性结构重构需求。

















