Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
清理空类别:基于递归的树状结构优化教程_创想鸟

清理空类别:基于递归的树状结构优化教程

清理空类别:基于递归的树状结构优化教程

本教程详细阐述了如何通过递归方法优化和清理树状分类结构。针对包含子类别但自身无内容,且其子类别也无内容的“空”类别,文章提供了一种高效的PHP解决方案。通过定义两个核心递归函数——isCleanable用于判断类别是否可清理,以及cleanCategories用于执行实际的清理操作——本教程展示了如何智能地修剪树,确保只保留通向实际内容或包含实际内容的子类别的有效路径。

在构建复杂的分类系统时,我们经常会遇到这样的场景:一个树状结构中包含大量类别,每个类别可能包含子类别和/或关联内容。然而,随着内容的增删,一些类别可能变得“空”——它们自身没有直接关联的内容,甚至其所有子类别也都没有任何内容。为了维护数据结构的整洁和效率,我们需要一种机制来自动识别并移除这些冗余的空类别,只保留那些最终能导向实际内容的路径。

问题定义

假设我们有一个以下结构的类别树:

[uid_of_category]   => (array)content      => [...associated content...] 或 empty   => (array)sub_categories      => [uid_of_category]         => (array)content             => [...associated content...] 或 empty         => (array)sub_categories         ...

我们的目标是清理这个树,使得只有满足以下条件的类别才被保留:

该类别直接包含关联内容。该类别本身没有关联内容,但其至少一个子类别(或子类别的子类别,以此类推)包含关联内容。

换句话说,任何不通向实际内容的“死胡同”路径都应该被移除。

解决方案:递归方法

处理树状结构最自然且强大的工具就是递归。我们将采用双函数递归策略来解决这个问题:一个函数负责判断一个类别及其所有后代是否“可清理”(即完全没有内容),另一个函数则负责遍历树并执行清理操作。

1. 判断类别是否可清理 (isCleanable)

这个函数的目标是确定一个给定的类别,以及其所有子类别,是否完全没有任何内容。如果一个类别自身没有内容,并且它的所有子类别(递归地)也都没有内容,那么这个类别就是“可清理”的。

/** * 判断一个类别及其所有后代是否完全没有内容(可清理)。 * * @param array $category 待检查的类别数组。 * @return bool 如果类别及其所有后代都没有内容,则返回 true;否则返回 false。 */function isCleanable(array $category): bool{    // 如果当前类别有内容,则它不可清理。    if (!empty($category['content'])) {        return false;    }    // 遍历当前类别的所有子类别。    // 如果任何一个子类别(或其后代)不可清理(即有内容),则当前类别也不可清理。    foreach ($category['sub_categories'] as $subCategory) {        if (!isCleanable($subCategory)) {            return false; // 发现有内容的子类别,当前类别不可清理        }    }    // 如果当前类别没有内容,且所有子类别都可清理(即也都没有内容),    // 那么当前类别就是可清理的。    return true;}

函数逻辑详解:

基本情况: 如果$category[‘content’]非空,说明这个类别自身有内容,它就不是一个“空”类别,因此不可清理,直接返回false。递归情况: 如果当前类别没有内容,我们需要检查它的子类别。我们遍历$category[‘sub_categories’],并对每个子类别递归调用isCleanable。如果isCleanable($subCategory)返回false(表示该子类别或其后代有内容),那么当前的父类别也就不应该被清理,因为它通向了内容,所以立即返回false。最终判断: 如果循环结束,意味着当前类别没有内容,并且它的所有子类别(递归检查后)也都被判定为可清理(即都没有内容),那么当前类别就是可清理的,返回true。

2. 执行清理操作 (cleanCategories)

这个函数负责遍历整个类别树,并根据isCleanable的判断结果移除相应的类别。为了能够修改原始的类别数组,我们需要通过引用传递参数。

/** * 递归地清理类别树,移除所有不包含内容或不通向内容的空类别。 * * @param array $categories 待清理的类别数组(通过引用传递)。 * @return void */function cleanCategories(array &$categories): void{    foreach ($categories as $key => &$category) { // 注意这里 $category 也是通过引用传递,以便修改子类别        // 如果当前类别是可清理的(自身和所有后代都没有内容),则移除它。        if (isCleanable($category)) {            unset($categories[$key]);        } else {            // 如果当前类别不可清理(有内容或通向内容),则递归清理其子类别。            // 确保 'sub_categories' 键存在且是数组,避免错误            if (isset($category['sub_categories']) && is_array($category['sub_categories'])) {                cleanCategories($category['sub_categories']);            }        }    }}

函数逻辑详解:

引用传递: $categories参数必须通过引用(&)传递。这是因为我们希望在函数内部直接修改调用者传入的数组(即移除元素),而不是创建一个副本。遍历与判断: 函数遍历当前级别的所有类别。对于每个类别:它调用isCleanable($category)。如果返回true,说明这个类别及其所有后代都没有内容,因此可以使用unset($categories[$key])将其从当前数组中移除。如果isCleanable($category)返回false(表示这个类别自身有内容,或者它的某个子类别有内容),那么这个类别需要保留。此时,我们递归地调用cleanCategories($category[‘sub_categories’])来处理它的子类别,确保子树中的空类别也被清理。

示例用法

假设我们有以下初始类别数据:

$categoryTree = [    'cat1' => [        'content' => [], // 空内容        'sub_categories' => [            'cat1_1' => [                'content' => [], // 空内容                'sub_categories' => []            ],            'cat1_2' => [                'content' => ['item_a'], // 有内容                'sub_categories' => []            ],            'cat1_3' => [                'content' => [], // 空内容                'sub_categories' => [                    'cat1_3_1' => [                        'content' => ['item_b'], // 有内容                        'sub_categories' => []                    ],                    'cat1_3_2' => [                        'content' => [], // 空内容                        'sub_categories' => []                    ]                ]            ]        ]    ],    'cat2' => [        'content' => [], // 空内容        'sub_categories' => [            'cat2_1' => [                'content' => [], // 空内容                'sub_categories' => []            ]        ]    ]];// 执行清理操作cleanCategories($categoryTree);// 打印清理后的树print_r($categoryTree);

清理后的预期结果:

cat2 会被移除,因为它自身没有内容,且其子类别cat2_1也没有内容。cat1_1 会被移除,因为它没有内容。cat1_3_2 会被移除,因为它没有内容。cat1_3 会被保留,因为它通向cat1_3_1(有内容)。cat1 会被保留,因为它通向cat1_2和cat1_3(都有内容)。

最终$categoryTree将只包含cat1、cat1_2、cat1_3、cat1_3_1,并且cat1_3下的cat1_3_2将被移除。

注意事项与优化

数据结构一致性: 确保您的类别数据严格遵循预期的content和sub_categories键结构。如果键名可能不存在或类型不匹配,请在代码中添加额外的检查(例如isset()和is_array())。引用传递的重要性: 再次强调,cleanCategories函数中的&$categories参数是关键。如果忘记&,函数将操作数组的副本,原始数组不会被修改。效率考量: 这种双递归函数的方法在逻辑上非常清晰,但在处理极其庞大的树时,可能会有多次遍历的开销。对于大多数应用场景,其性能是足够的。更高级的优化可能涉及单次遍历的后序遍历(post-order traversal)策略,但在代码复杂性上会增加。错误处理: 在生产环境中,您可能需要添加额外的错误处理,例如检查输入是否为有效的数组结构。

总结

通过递归函数isCleanable和cleanCategories的巧妙结合,我们能够高效且精确地清理复杂的树状分类结构。这种方法不仅保证了数据结构的整洁,也为后续的数据处理和展示提供了优化过的基础。理解并掌握递归在处理树形数据结构中的应用,是每一个开发者必备的技能。

以上就是清理空类别:基于递归的树状结构优化教程的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1267705.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
PHP怎样开发在线设计工具?高级功能付费解锁
上一篇 2025年12月10日 10:31:37
VSCode怎样在终端运行PHP文件查看执行结果 VSCode新手终端运行PHP文件的实用教程​
下一篇 2025年12月10日 10:33:01

相关推荐

  • 京东商户入驻后如何设置促销_京东商户促销活动设置方法及规则解析

    京东商户入驻后如何设置促销_京东商户促销活动设置方法及规则解析京东商户入驻后如何设置促销_京东商户促销活动设置方法及规则解析京东商户入驻后如何设置促销_京东商户促销活动设置方法及规则解析京东商户入驻后如何设置促销_京东商户促销活动设置方法及规则解析

    首先进入京麦商家工作台营销中心创建促销活动,选择满减、满件打折等合适类型,按规则设置阶梯优惠与商品参与范围,定向人群及推广链接后提交审核,确保活动按时上线并监控展示效果。 如果您希望在京东平台提升商品销量和店铺曝光,合理的促销活动设置是关键环节。京东为商户提供了多样化的促销工具,但需遵循特定的规则和…

    2026年9月26日 • 用户投稿
    000
  • 俄版搜索引擊主页yandex入口 俄罗斯浏览器搜索引擎入口yandex链接

    俄版搜索引擊主页yandex入口 俄罗斯浏览器搜索引擎入口yandex链接俄版搜索引擊主页yandex入口 俄罗斯浏览器搜索引擎入口yandex链接俄版搜索引擊主页yandex入口 俄罗斯浏览器搜索引擎入口yandex链接俄版搜索引擊主页yandex入口 俄罗斯浏览器搜索引擎入口yandex链接

    Yandex,被誉为“俄罗斯的谷歌”,是该国最大的互联网技术公司和搜索引擎。本文将为您清晰介绍Yandex的主要官方入口链接,并简要说明其核心功能,帮助您快速了解和使用这个强大的信息工具。 一、Yandex是什么? 1、立即进入“☞☞☞☞点击俄版搜索引擊主页yandex入口☜☜☜☜”; 2、立即进入…

    2026年9月26日 • 用户投稿
    000
  • 英特尔 NUC 主机程序崩溃?三星 SSD 主控老化掉速诊断​

    英特尔 NUC 主机程序崩溃?三星 SSD 主控老化掉速诊断​英特尔 NUC 主机程序崩溃?三星 SSD 主控老化掉速诊断​英特尔 NUC 主机程序崩溃?三星 SSD 主控老化掉速诊断​英特尔 NUC 主机程序崩溃?三星 SSD 主控老化掉速诊断​

    英特尔 nuc 主机程序崩溃,很可能是三星 ssd 主控老化掉速引起。1. 通过检查系统日志查看是否有磁盘错误信息;2. 使用 crystaldiskinfo 等工具读取 smart 信息判断 ssd 健康状态;3. 尝试更换 ssd 验证是否为原 ssd 问题。若确认为 ssd 老化掉速,可优化 …

    2026年9月26日 • 用户投稿
    000
  • NVIDIA RTX 4090是不是性能过剩了?

    RTX 4090是否性能过剩取决于用途:1. 游戏方面,在主流游戏如《守望先锋2》《赛博朋克2077》中性能明显溢出,多数玩家难以用满其能力;2. 生产力领域,凭借24GB显存和强大算力,它在AI训练、3D渲染等任务中仍具价值;3. 技术体验上,DLSS 3、Reflex等技术提供低延迟与未来兼容性…

    2026年9月26日
    1200
  • Claude是否能用于编写剧本 AI生成剧情内容的能力与使用体验

    Claude是否能用于编写剧本 AI生成剧情内容的能力与使用体验Claude是否能用于编写剧本 AI生成剧情内容的能力与使用体验Claude是否能用于编写剧本 AI生成剧情内容的能力与使用体验Claude是否能用于编写剧本 AI生成剧情内容的能力与使用体验

    本文将围绕利用AI工具进行剧本创作这一问题展开探讨。文章会首先介绍AI在剧情生成方面的核心能力,接着通过详细的步骤讲解,指导用户如何借助AI工具进行剧本的构思、撰写与优化,从而让用户了解整个操作流程。最后,会结合实际使用体验,分析其在创作过程中的优势与需要注意的方面,帮助创作者更有效地利用这一技术。…

    2026年9月26日 • 用户投稿
    700
  • windows卡在欢迎界面怎么办_Windows卡在欢迎界面无法进入系统解决方法

    windows卡在欢迎界面怎么办_Windows卡在欢迎界面无法进入系统解决方法windows卡在欢迎界面怎么办_Windows卡在欢迎界面无法进入系统解决方法windows卡在欢迎界面怎么办_Windows卡在欢迎界面无法进入系统解决方法windows卡在欢迎界面怎么办_Windows卡在欢迎界面无法进入系统解决方法

    强制重启进入安全模式排查问题,确认是否因第三方程序导致;2. 创建新用户账户以绕过损坏的配置文件;3. 禁用非必要启动项和服务释放系统资源;4. 使用sfc和DISM命令修复系统文件与镜像;5. 卸载最近更新或驱动解决兼容性问题,最终恢复系统正常登录。 如果您在启动Windows系统时,发现设备长时…

    2026年9月26日 • 用户投稿
    200
  • ChatGPT是否支持协同编辑 聊天过程中多人编辑的使用方式探讨

    ChatGPT是否支持协同编辑 聊天过程中多人编辑的使用方式探讨ChatGPT是否支持协同编辑 聊天过程中多人编辑的使用方式探讨ChatGPT是否支持协同编辑 聊天过程中多人编辑的使用方式探讨ChatGPT是否支持协同编辑 聊天过程中多人编辑的使用方式探讨

    关于ChatGPT是否支持多人协同编辑的问题,目前的答案是其本身不具备原生的实时协同功能。然而,这并不意味着无法实现多人协作。本文将通过一种结构化的角色扮演方法,详细讲解如何在一个聊天会话中模拟多人编辑与讨论的场景,让您清晰地掌握具体的操作流程,从而有效地利用ChatGPT进行团队协作。 ☞☞☞AI…

    2026年9月26日 • 用户投稿
    000
  • win8电脑自动重启是什么原因_Win8自动重启原因及修复

    win8电脑自动重启是什么原因_Win8自动重启原因及修复win8电脑自动重启是什么原因_Win8自动重启原因及修复win8电脑自动重启是什么原因_Win8自动重启原因及修复win8电脑自动重启是什么原因_Win8自动重启原因及修复

    答案:Windows 8电脑无故重启主因是系统崩溃、硬件故障或软件冲突。应先关闭“系统失败时自动重启”以查看蓝屏代码,再更新驱动、运行SFC扫描修复系统文件,排查内存、散热及电源问题,并进行病毒查杀。 如果您发现Windows 8电脑在使用过程中无故自动重启,这通常是由系统崩溃、硬件故障或软件冲突引…

    2026年9月26日 • 用户投稿
    000
  • yandex搜索引擎入口地址 yandex网页入口引擎直达

    yandex搜索引擎入口地址 yandex网页入口引擎直达yandex搜索引擎入口地址 yandex网页入口引擎直达yandex搜索引擎入口地址 yandex网页入口引擎直达yandex搜索引擎入口地址 yandex网页入口引擎直达

    Yandex作为一款功能强大的搜索引擎,尤其在图像搜索和东欧语系内容方面表现出色,是许多用户的优选工具。本文将为您提供Yandex网页版的核心入口地址,并解析不同入口的特点,帮助您根据需求快速、直接地访问。 1、立即进入“☞☞☞☞点击yandex搜索引擎入口地址☜☜☜☜”; 2、立即进入“☞☞☞☞点…

    2026年9月26日 • 用户投稿
    000
  • sublime如何安装monokai pro主题_sublime Monokai Pro主题安装教程

    sublime如何安装monokai pro主题_sublime Monokai Pro主题安装教程sublime如何安装monokai pro主题_sublime Monokai Pro主题安装教程sublime如何安装monokai pro主题_sublime Monokai Pro主题安装教程sublime如何安装monokai pro主题_sublime Monokai Pro主题安装教程

    确保安装Package Control,通过官网获取代码在Sublime控制台运行;2. 使用Ctrl+Shift+P打开命令面板,通过Package Control搜索并安装Monokai Pro;3. 再次打开命令面板选择“Monokai Pro: Activate Theme”启用主题,或手动…

    2026年9月26日 • 用户投稿
    200
  • 抖音账号怎么快速涨粉_抖音账号快速涨粉的实用策略

    抖音账号怎么快速涨粉_抖音账号快速涨粉的实用策略抖音账号怎么快速涨粉_抖音账号快速涨粉的实用策略抖音账号怎么快速涨粉_抖音账号快速涨粉的实用策略抖音账号怎么快速涨粉_抖音账号快速涨粉的实用策略

    答案是账号定位模糊和内容缺乏吸引力导致播放量低、粉丝增长慢。应通过选择垂直领域、打造统一人设、创作“痛点+解决方案”结构的爆款内容、布局搜索关键词、设计评论区互动暗号、精准投放DOU+及借力热点二次创作等策略,提升曝光与粉丝增长。 如果您希望抖音账号在短时间内获得大量关注,但发现内容播放量低、粉丝增…

    2026年9月26日 • 用户投稿
    100
  • windows商店打不开怎么办_Microsoft Store应用商店打不开修复教程

    windows商店打不开怎么办_Microsoft Store应用商店打不开修复教程windows商店打不开怎么办_Microsoft Store应用商店打不开修复教程windows商店打不开怎么办_Microsoft Store应用商店打不开修复教程windows商店打不开怎么办_Microsoft Store应用商店打不开修复教程

    使用UU加速器优化网络连接,2. 重置Microsoft Store缓存,3. 启用TLS 1.1和1.2协议,4. 更换为Google公共DNS,5. 重置Microsoft Store应用本身,可依次排查并解决商店无法打开问题。 如果您尝试打开Microsoft Store应用商店,但应用无法加…

    2026年9月26日 • 用户投稿
    000
  • 电脑电池充满电后继续插着电源会损害电池吗?

    电脑电池充满电后继续插着电源会损害电池吗?电脑电池充满电后继续插着电源会损害电池吗?电脑电池充满电后继续插着电源会损害电池吗?电脑电池充满电后继续插着电源会损害电池吗?

    笔记本电池充满后继续插电不会过充,但长期满电和高温会加速电池老化,建议启用充电阈值功能(如60%~80%),并定期浅放电以延长寿命。 电脑电池充满电后继续插着电源,这事儿说起来挺微妙的。简单来说,现代笔记本电脑在充满电后,内部的智能充电电路会接管,让机器直接使用电源适配器的电力,而不是反复充放电池。…

    2026年9月26日 • 用户投稿
    000
  • Debian更新为何选择FetchDebian

    根据搜索结果,我没有找到为什么选择fetchdebian的具体信息,但是我可以为您提供一些关于debian更新的相关信息: Debian更新机制 Debian系统更新的主要方式是通过APT(Advanced Package Tool)包管理器进行的。APT是一个强大的工具,它可以自动处理软件包的安装…

    2026年9月26日
    000
  • 宁美电脑蓝牙失联?蓝牙模块老化故障排查与配对方法​

    宁美电脑蓝牙失联?蓝牙模块老化故障排查与配对方法​宁美电脑蓝牙失联?蓝牙模块老化故障排查与配对方法​宁美电脑蓝牙失联?蓝牙模块老化故障排查与配对方法​宁美电脑蓝牙失联?蓝牙模块老化故障排查与配对方法​

    宁美电脑蓝牙失联通常是驱动、设置或硬件问题。1.首先检查设备管理器中蓝牙设备是否正常,有无感叹号或叉号;2.尝试更新驱动或卸载后重装;3.使用驱动精灵等工具辅助修复;4.检查蓝牙服务是否开启并设为自动启动;5.删除旧配对记录并重新连接;6.确认设备兼容性和信号干扰情况;7.排查硬件故障,如模块松动或…

    2026年9月26日 • 用户投稿
    200
  • WPS如何将图片转PDF_WPS图片转PDF合并与导出方法

    WPS如何将图片转PDF_WPS图片转PDF合并与导出方法WPS如何将图片转PDF_WPS图片转PDF合并与导出方法WPS如何将图片转PDF_WPS图片转PDF合并与导出方法WPS如何将图片转PDF_WPS图片转PDF合并与导出方法

    WPS Office支持将图片转为PDF并合并导出,适用于整理照片、扫描件等。1. 单张图片转换:新建→图片转PDF→选择文件→导出即可;2. 多张图片合并:通过“添加图片”多选并调整顺序,一键合成PDF,适合制作简历或作品集;3. 可选设置包括页面尺寸、图片质量和排版,提升输出效果;4. 手机端操…

    2026年9月26日 • 用户投稿
    100
  • sublime怎么配置swift开发环境_sublime Swift开发环境配置教程

    sublime怎么配置swift开发环境_sublime Swift开发环境配置教程sublime怎么配置swift开发环境_sublime Swift开发环境配置教程sublime怎么配置swift开发环境_sublime Swift开发环境配置教程sublime怎么配置swift开发环境_sublime Swift开发环境配置教程

    安装Sublime Text 4并配置Package Control;2. 通过Package Control安装Swift语法插件;3. 创建自定义Build System运行Swift代码;4. 可选安装SwiftFormat实现代码格式化;5. 注意缺乏调试与完整类型提示,适用于学习和小项目。…

    2026年9月26日 • 用户投稿
    000
  • 用豆包AI实现Python内存管理优化

    用豆包AI实现Python内存管理优化用豆包AI实现Python内存管理优化用豆包AI实现Python内存管理优化用豆包AI实现Python内存管理优化

    豆包ai可通过分析内存使用模式、优化数据结构与对象创建、辅助编写内存友好代码帮助python内存管理优化。1. 发送代码片段给豆包ai,询问潜在内存问题,如循环引用或缓存未释放,并获得使用gc模块或弱引用的建议;2. 让豆包ai识别低效对象创建和不恰当数据结构,推荐生成器、itertools函数、节…

    2026年9月26日 • 用户投稿
    000
  • uc浏览器夸克网盘入口在哪里_UC浏览器内置夸克网盘功能入口

    uc浏览器夸克网盘入口在哪里_UC浏览器内置夸克网盘功能入口uc浏览器夸克网盘入口在哪里_UC浏览器内置夸克网盘功能入口uc浏览器夸克网盘入口在哪里_UC浏览器内置夸克网盘功能入口uc浏览器夸克网盘入口在哪里_UC浏览器内置夸克网盘功能入口

    1、打开UC浏览器并登录账号,向下滑动首页查找“常用服务”或“工具箱”中的夸克网盘图标;2、若未找到,点击右上角“三”图标,在菜单中查找网盘、云盘或“我的文件”选项;3、仍无结果时,可在顶部搜索框输入“夸克网盘”,从推荐服务中点击“直达”链接进入;4、最后检查设置中的“插件管理”,确保夸克网盘插件已…

    2026年9月26日 • 用户投稿
    100
  • 如何在Debian中自定义GitLab界面

    在debian中自定义gitlab界面可以通过以下几种方式进行: 更改界面语言为中文 登录GitLab并进入设置:打开浏览器,访问GitLab的URL。使用管理员账号登录。点击右上角的用户头像,选择“Settings”(设置)。修改用户界面语言:在左侧导航栏中找到“Preferences”(偏好设置…

    2026年9月26日
    100

发表回复

登录后才能评论
关注微信