You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何清理分类树中的空分类,仅保留含内容或子分类有内容的节点

分类树清理实现方案

核心逻辑

我们采用后序遍历的递归思路,先处理子节点再判断父节点是否保留,完全匹配你的保留规则:

  • 先递归清理当前节点下的所有子分类,清除所有无效子节点
  • 再判断当前节点是否需要保留:只要满足「自身content非空」或「清理后仍存在有效子分类」任一条件就保留,否则删除

代码实现(PHP示例,匹配你给出的数组结构)

/**
 * 清理单条分类节点及其子树
 * @param array $category 传入的单个分类节点,传引用直接修改原数据
 * @return bool 当前节点是否为有效节点(是否需要保留)
 */
function cleanCategory(array &$category): bool
{
    // 先处理所有子分类,删除无效子节点
    foreach ($category['sub_categories'] as $uid => &$subCategory) {
        if (!cleanCategory($subCategory)) {
            unset($category['sub_categories'][$uid]);
        }
    }
    // 取消子分类引用,避免后续遍历出现异常
    unset($subCategory);

    // 判定当前节点有效性
    $hasOwnContent = !empty($category['content']);
    $hasValidChildren = !empty($category['sub_categories']);
    return $hasOwnContent || $hasValidChildren;
}

// 调用入口:清理整棵分类树
foreach ($yourCategoryTree as $rootUid => &$rootNode) {
    if (!cleanCategory($rootNode)) {
        unset($yourCategoryTree[$rootUid]);
    }
}
unset($rootNode);

逻辑说明

如果使用其他编程语言,只需要修改数组遍历、删除的对应语法,核心逻辑完全通用:

  1. 递归永远先处理子节点,保证判断父节点时已经拿到所有子节点的有效性结果
  2. 本身无内容但子节点有有效内容的父节点,会因为清理后sub_categories不为空被保留
  3. 本身无内容且所有子节点都无效的节点会被直接删除,不会出现在最终结果里

内容的提问来源于stack exchange,提问作者jmcclane

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 13:39:00