当前位置:首页 > 文章列表 > 文章 > php教程 > 递归查找树形数组中slug节点及子树方法

递归查找树形数组中slug节点及子树方法

2026-01-07 12:45:41 0浏览 收藏

亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《递归查找树形数组中 slug 节点及子树方法》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下,希望所有认真读完的童鞋们,都有实质性的提高。

如何在嵌套树形数组中递归查找指定 slug 的节点及其完整子树

本文讲解如何使用递归函数在具有 `child` 键的多层嵌套数组(菜单树结构)中精准定位目标节点,并完整返回该节点及其全部后代,解决因递归调用未正确返回值导致结果为空的常见错误。

在处理菜单、分类或组织架构等树形数据时,常以嵌套数组形式存储,其中每个节点通过 'child' 键关联其子节点(如示例中的关联结构为 ['child']['2']['child']['4']...)。此时若需根据 slug 查找某节点并连同其整个子树一并返回,必须确保递归调用的结果被正确捕获与传递——而这正是原代码失败的核心原因。

原函数中虽检测到 child 存在,却注释掉了递归调用语句,且未对递归结果做任何判断或返回:

if (isset($row['child'])) {
    // return $this->getSlugData($slug, $row['child']); ← 被注释,且缺少 return
}

即使取消注释,也仅返回第一层子树的匹配结果,而忽略更深层的可能匹配;更重要的是,未检查递归调用是否真正找到了目标,导致即使子树中命中,父级循环仍继续执行并最终返回空数组 []。

✅ 正确做法是:

  • 对每一层级的 $row 先做直接匹配;
  • 若未命中,再对其所有子结构(不限于 'child' 键,而是遍历所有数组型子项)递归搜索;
  • 关键:每次递归调用后立即检查返回值,一旦非空即刻 return,避免被后续迭代覆盖。

以下是优化后的健壮实现:

function getSlugData(string $slug, array $data, string $key = 'slug'): array
{
    foreach ($data as $row) {
        // 1. 直接匹配当前节点
        if (isset($row[$key]) && $row[$key] === $slug) {
            return $row; // ✅ 找到即返回完整节点(含其 child)
        }

        // 2. 深度递归:遍历当前节点所有子数组(兼容 child、items、children 等不同键名)
        foreach ($row as $value) {
            if (is_array($value)) {
                $result = getSlugData($slug, $value, $key);
                if (!empty($result)) {
                    return $result; // ✅ 递归命中,立即返回,不继续循环
                }
            }
        }
    }

    return []; // ❌ 全部遍历完毕仍未找到
}

? 为什么不用硬编码 if (isset($row['child']))?
因为真实项目中树结构键名可能多样(如 children、items、submenus),甚至同一棵树混用多个键。上例采用“对每个数组值递归”的策略,天然支持任意嵌套结构,更具通用性与可维护性。

调用示例:

$tree = json_decode('[{"id":1,"slug":"medicinskaya-ge","child":{"2":{"id":2,"slug":"dnk-diagnostika","child":{"6":{"id":6,"slug":"testirovanie-ge"}}}}} ]', true);

var_dump(getSlugData('testirovanie-ge', $tree));
// 输出:包含 id=6 的完整节点,且保留其上级 child 结构链(即原始嵌套上下文)

var_dump(getSlugData('nonexistent', $tree)); // 输出:[]

? 注意事项总结:

  • 始终检查递归调用的返回值,避免“调用了却丢弃结果”;
  • 使用 !empty($result) 或 $result !== [] 判断,而非 isset($result)(因空数组也是合法返回);
  • 若需严格限定只查 'child' 键(如 API 协议强制),可将内层 foreach 替换为:
    if (isset($row['child']) && is_array($row['child'])) {
        $result = getSlugData($slug, $row['child'], $key);
        if (!empty($result)) return $result;
    }
  • 函数设计为纯函数(无副作用),便于单元测试与复用。

通过以上重构,即可稳定、高效地从任意深度的树形数组中提取目标节点及其完整子树。

今天关于《递归查找树形数组中slug节点及子树方法》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

夸克浏览器怎么解压文件?夸克浏览器怎么解压文件?
上一篇
夸克浏览器怎么解压文件?
必装实用手机软件推荐清单
下一篇
必装实用手机软件推荐清单
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • ljg-skills -
    ljg-skills
    ljg-skills 是李继刚开源的 AI 技能与提示词集合,面向大模型使用者整理了一批可复用的 prompt、角色设定和任务技能模板,适合用于学习提示词设计、搭建个人 AI 工作流和沉淀团队常用智能体能力。
    3382次使用
  • MELO音乐 - AI 音乐生成平台,支持多模态创作能力
    MELO音乐
    MELO音乐是一站式AI视频与音乐制作助手,对标suno, udio的高品质体验。提供伴奏生成、原创写词、无损导出、哼唱识曲、混音变声等全套音频与短视频编辑工具。无论是流行Kpop、电音说唱、民谣古风、摇滚儿歌还是商用轻音乐,MELO为你免费谱曲,轻松做同款!
    3135次使用
  • UniScribe - AI 免费在线音视频转文字平台
    UniScribe
    UniScribe 是一款 AI 音视频转文字与内容整理工具,支持上传音频、视频文件或粘贴 YouTube 链接,自动生成转写文本、摘要、思维导图和关键问题,并支持多格式导出,适合会议记录、课程学习、访谈整理和内容创作复盘。
    3090次使用
  • 剧云 - 免费 AI 智能中文剧本创作平台
    剧云
    剧云是专业中文剧本创作平台,安全稳定运行十余年,集成AI编剧、剧本医生审核、人物小传、剧情关系图、大纲编写、多人协作、Word导入导出、版权管控功能,数据安全防护,轻松高效创作剧本。
    3293次使用
  • 万象有声 - AI 一站式有声内容创作平台
    万象有声
    万象有声,一个专为有声创作者打造的新一代智能有声内容创作平台。平台提供专业的智能拆章、智能画本编辑、AI配音、AI生成音效、后期制作、智能对轨、智能审听等有声创作全流程工具,可以帮助创作者高效、低成本创作出引人入胜的有声作品。立即体验,让有声书制作更简单!
    3244次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码