面包屑需从当前栏目向上逐层查询父级,用while循环+array_unshift()构建逆向路径;避免递归防栈溢出,SQL自连接适用于深度稳定的场景,渲染时需结构化输出并安全处理链接与分隔符。
PHP 中用递归获取栏目面包屑的典型结构
面包屑本质是「当前栏目 → 父栏目 → 祖父栏目」的逆向路径,必须从当前 $cat_id 向上逐层查 parent_id,不能正向遍历。常见错误是写成“从顶级开始往下找”,结果死循环或漏级。
假设栏目表 category 有字段:id、name、parent_id(根栏目为 0 或 NULL):
function getBreadcrumb($cat_id, $pdo) {
$crumb = [];
while ($cat_id > 0) {
$stmt = $pdo->prepare("SELECT id, name, parent_id FROM category WHERE id = ?");
$stmt->execute([$cat_id]);
$row = $stmt->fetch();
if (!$row) break;
array_unshift($crumb, ['id' => $row['id'], 'name' => $row['name']]);
$cat_id = (int)$row['parent_id'];
}
return $crumb;
}
- 用
while而非递归函数,避免 PHP 栈溢出(尤其栏目深度 > 10) -
array_unshift()是关键:每次把父级插到开头,自然形成「首页 → A → B → 当前」顺序 - 必须判断
!$row中断,防止因数据异常(如parent_id指向不存在 ID)陷入无限循环
MySQL 自连接一次性查出完整路径(适合中等深度)
当栏目树深度稳定(如 ≤6 级),用 SQL 自连接比 PHP 循环更高效,减少查询次数。但注意 MySQL 8.0+ 才原生支持递归 CTE,低版本得靠 JOIN 拼接。
例如查三级路径(根 → 二级 → 当前):
立即学习“PHP免费学习笔记(深入)”;