如何清理分类树中的空分类,仅保留含内容或子分类有内容的节点
分类树清理实现方案
核心逻辑
我们采用后序遍历的递归思路,先处理子节点再判断父节点是否保留,完全匹配你的保留规则:
- 先递归清理当前节点下的所有子分类,清除所有无效子节点
- 再判断当前节点是否需要保留:只要满足「自身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);
逻辑说明
如果使用其他编程语言,只需要修改数组遍历、删除的对应语法,核心逻辑完全通用:
- 递归永远先处理子节点,保证判断父节点时已经拿到所有子节点的有效性结果
- 本身无内容但子节点有有效内容的父节点,会因为清理后
sub_categories不为空被保留 - 本身无内容且所有子节点都无效的节点会被直接删除,不会出现在最终结果里
内容的提问来源于stack exchange,提问作者jmcclane
相关产品推荐
相关产品推荐

