php中用递归实现商品无限极分类,核心是通过函数反复调用自身逐层展开子类,生成带缩进、层级标识或嵌套数组的树形结构;数据库需设计含id、name、pid字段的单表;先一次性查出所有数据并构建父子映射,再用递归函数生成html列表或反向追溯路径。

PHP中用递归实现商品无限极分类,核心是把树形结构数据(如父子关系的分类表)通过函数反复调用自身,逐层展开子类,最终生成带缩进、层级标识或嵌套数组的结果。
数据库表结构设计
需一张分类表,至少包含:id(主键)、name(分类名)、pid(父级ID,顶级为0或NULL)。例如:
- 1 → 手机 → pid=0
- 2 → 苹果 → pid=1
- 3 → iPhone 15 → pid=2
- 4 → 电脑 → pid=0
- 5 → 笔记本 → pid=4
获取全部分类并构建成树形数组
先一次性查出所有分类,再用PHP组织成“父→子”嵌套结构,避免多次查询。推荐使用索引加速查找:
$categories = $pdo->query("SELECT id, name, pid FROM category ORDER BY pid, id")->fetchAll(PDO::FETCH_ASSOC);
$map = [];
foreach ($categories as $cat) {
$map[$cat['id']] = $cat;
}
$tree = [];
foreach ($categories as $cat) {
if ($cat['pid'] == 0) {
$tree[] = $cat;
} else {
$map[$cat['pid']]['children'][] = $cat;
}
}
此时 $tree 是顶层分类数组,每个元素可能含 children 子数组——这是递归的基础结构。
递归函数生成带层级的HTML列表
定义一个接收分类数组和当前层级的函数,自动拼接缩进或CSS类:
function buildCategoryList($list, $level = 0) {
if (empty($list)) return '';
$html = '
- ';
foreach ($list as $item) {
$html .= '
- ' . str_repeat('│ ', $level) . '├─ ' . htmlspecialchars($item['name']); if (!empty($item['children'])) { $html .= buildCategoryList($item['children'], $level + 1); } $html .= ' '; } $html .= '
输出效果类似:
- ├─ 手机
- │ ├─ 苹果
- │ │ ├─ iPhone 15
- │ ├─ 苹果
- ├─ 电脑
- │ ├─ 笔记本
递归生成扁平化路径(用于面包屑或URL)
若需获取某分类的完整路径(如「手机 / 苹果 / iPhone 15」),可写一个根据ID反向追溯父级的递归函数:
function getCategoryPath($id, $map, $path = []) {
if (!$id || !isset($map[$id])) return $path;
array_unshift($path, $map[$id]['name']);
if ($map[$id]['pid'] != 0) {
return getCategoryPath($map[$id]['pid'], $map, $path);
}
return $path;
}
$path = getCategoryPath(3, $map); // 得到 ['手机', '苹果', 'iPhone 15']
echo implode(' / ', $path); // 输出:手机 / 苹果 / iPhone 15
不复杂但容易忽略:递归深度过高时注意设置 max_execution_time 和避免死循环(确保 pid 指向真实存在且非自指)。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











