PHP递归处理无限层级分类数组 查找指定ID对应全链路父分类
实现方案
调整后可运行代码
/** * 查找目标分类ID对应的完整父级路径及关联子分类结构 * @param int $targetId 目标子分类ID * @param array $categories 顶层分类数组 * @return array|null 匹配到的路径结构,未找到返回null */ function getCategoryFullPath(int $targetId, array $categories): ?array { foreach ($categories as $category) { // 匹配到目标分类直接返回 if ($category['id'] === $targetId) { return $category; } // 递归遍历子分类 if (!empty($category['subCategories'])) { $matchedSub = getCategoryFullPath($targetId, $category['subCategories']); if ($matchedSub !== null) { // 若需保留父分类下所有兄弟子分类,删除下一行代码即可 $category['subCategories'] = [$matchedSub]; return $category; } } } return null; } // 调用示例 $res = getCategoryFullPath(5208, $categories);
原代码问题说明
- 每次进入函数都执行
$holder = []清空了递归积累的结果,只能拿到最后一次匹配的内容 - 没有父级追溯逻辑,仅匹配到目标ID所在层级后就直接合并平级内容,无法封装上层父分类信息
- 递归逻辑遍历所有键值对,没有针对分类节点结构做定向判断,容易误匹配其他数组内容
效果说明
默认返回的结果会保留从顶层父分类到目标子分类的完整层级路径,每个层级仅保留关联的子分类节点;如果需要保留父分类下所有兄弟子分类,删除代码中注释标注的那一行即可。
内容的提问来源于stack exchange,提问作者user7322312
相关产品推荐
相关产品推荐

