如何通过子ID获取父ID?层级分类数据库路径查询实现
实现分类路径生成的解决方案
首先,先把你的数据库结构整理成更清晰的表格形式:
| id | parent_id | category_name |
|---|---|---|
| 1 | 0 | Vehicle |
| 2 | 0 | Tv |
| 3 | 0 | Phone |
| 4 | 1 | Bmw X Series |
| 5 | 2 | Led Tv |
| 6 | 2 | Plazma Tv |
| 7 | 3 | Samsung |
| 8 | 3 | Iphone |
| 9 | 4 | Bmw X7 |
你的现有代码已经能定位到顶级分类的ID,但缺少收集路径上所有分类名称并拼接成指定格式的核心逻辑。下面给出两种实用的实现思路:
方法一:基于现有代码扩展(递归+循环收集路径)
我们可以新增一个路径生成函数,从目标子分类开始向上遍历父分类,收集所有层级的名称后再调整顺序拼接:
// 保留你原有的get_key函数,用于查找数组中对应ID的索引 function get_key($arr, $id) { foreach ($arr as $key => $val) { if ($val['id'] === $id) { return $key; } } return null; } // 新增的完整路径生成函数 function getCategoryPath($arr, $id) { $path = []; $currentId = $id; // 循环向上遍历父分类,直到找到顶级分类 while (true) { $key = get_key($arr, $currentId); if ($key === null) break; // 找不到对应ID时终止 // 将当前分类名称加入路径数组 $path[] = $arr[$key]['category_name']; // 到达顶级分类(parent_id=0)时停止遍历 if ($arr[$key]['parent_id'] === 0) { break; } // 切换到父分类ID继续遍历 $currentId = $arr[$key]['parent_id']; } // 反转数组,得到从顶级到子分类的顺序,再用" > "拼接 return implode(' > ', array_reverse($path)); }
测试示例
假设你的数据库数据已转为PHP数组:
$categories = [ ['id' => 1, 'parent_id' => 0, 'category_name' => 'Vehicle'], ['id' => 2, 'parent_id' => 0, 'category_name' => 'Tv'], ['id' => 3, 'parent_id' => 0, 'category_name' => 'Phone'], ['id' => 4, 'parent_id' => 1, 'category_name' => 'Bmw X Series'], ['id' => 5, 'parent_id' => 2, 'category_name' => 'Led Tv'], ['id' => 6, 'parent_id' => 2, 'category_name' => 'Plazma Tv'], ['id' => 7, 'parent_id' => 3, 'category_name' => 'Samsung'], ['id' => 8, 'parent_id' => 3, 'category_name' => 'Iphone'], ['id' => 9, 'parent_id' => 4, 'category_name' => 'Bmw X7'], ];
调用函数测试效果:
echo getCategoryPath($categories, 5); // 输出:Tv > Led Tv echo getCategoryPath($categories, 9); // 输出:Vehicle > Bmw X Series > Bmw X7 echo getCategoryPath($categories, 7); // 输出:Phone > Samsung
方法二:优化查找效率(转为ID键的关联数组)
上面的方法每次查找都要遍历数组,当分类数量较多时效率会下降。我们可以先把数组转换成以id为键的关联数组,直接通过ID快速定位分类:
// 将普通数组转为ID为键的关联数组,提升查找速度 function convertToAssocArray($arr) { $assocArr = []; foreach ($arr as $item) { $assocArr[$item['id']] = $item; } return $assocArr; } // 优化后的路径生成函数 function getCategoryPathOptimized($assocArr, $id) { $path = []; $currentId = $id; // 直接通过ID索引查找,无需循环遍历 while (isset($assocArr[$currentId])) { $path[] = $assocArr[$currentId]['category_name']; if ($assocArr[$currentId]['parent_id'] === 0) { break; } $currentId = $assocArr[$currentId]['parent_id']; } return implode(' > ', array_reverse($path)); }
使用示例
$assocCategories = convertToAssocArray($categories); echo getCategoryPathOptimized($assocCategories, 9); // 输出:Vehicle > Bmw X Series > Bmw X7
这个优化方案更适合分类数据量大的场景,能有效减少查找耗时。
内容的提问来源于stack exchange,提问作者ufuk
相关产品推荐
相关产品推荐

