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

如何通过子ID获取父ID?层级分类数据库路径查询实现

实现分类路径生成的解决方案

首先,先把你的数据库结构整理成更清晰的表格形式:

idparent_idcategory_name
10Vehicle
20Tv
30Phone
41Bmw X Series
52Led Tv
62Plazma Tv
73Samsung
83Iphone
94Bmw 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:01:50