PHP 递归实现无限级分类树形菜单代码示例
本文分享一段基于 PHP 递归实现的树形菜单代码,主要用于解决电子商务网站中商品分类等无限级层级的显示问题。代码通过 SQL 查询获取分类数据,利用静态数组记录当前路径以计算层级深度,最终返回带有缩进和级别信息的二维数组。
核心实现逻辑
实现树形菜单的关键在于两点:一是按层级顺序扁平化输出分类列表,二是准确标记每个节点的缩进空格和所属层级。本方案采用递归函数 procCategory,在每次查询父节点下的一级子节点后,递归调用自身处理更深层次的数据,从而将嵌套结构转换为易于模板渲染的线性列表。
第1步:定义递归函数与初始化参数
首先创建一个类方法,接收站点ID($sid)和当前父级ID($pid)。声明一个静态数组 $arr 用于在整个递归过程中保存当前正在处理的父节点 ID 路径,这是计算层级的关键依据。
public function procCategory($sid, $pid) {
$return = array();
$key = 0;
static $arr = array(); // 分类级别参考数组,记录当前路径
// 构造SQL查询当前层级下的所有直接子节点
$sql = "select cid,pcid,name from shop_goods_catalog where sid='{$sid}' and pcid = '{$pid}'";
$result = $this->__db->query($sql);
第2步:遍历结果集并计算层级
使用 while 循环遍历数据库返回的每一行数据。如果当前节点的父级 ID 为 0(顶级分类),则重置路径数组。接着将当前子节点的 ID 加入路径数组,并根据其在数组中的位置(索引)确定缩进空格的次数。
while($row=$this->__db->fetchArray($result)){
$nbsp = '';
if($row['pcid']==0){
$arr = array();
}
$arr[] = $row['pcid'];
// 只有非顶级分类才需要添加树形缩进
if($row['pcid']>0){
// 查找当前ID在路径数组中的位置作为层级键
$key = array_search($row['pcid'], $arr);
// 根据层级数填充空格
for($i=0;$i<$key;$i++){
$nbsp .= ' ';
}
// 更新路径:若当前ID在之前已出现(分支结束回溯),则截断数组至当前位置
if(count($arr)>1 && count(array_keys($arr,$row['pcid']))>1){
$arr = array_slice($arr,0,$key+1);
}
}
第3步:格式化输出并递归子节点
将生成的缩进字符串拼接到分类名称前,并记录当前层级级别供前端样式控制。随后,以当前节点的 ID 作为新的父级 ID 再次调用递归函数,获取其子分类列表,并使用 array_merge 合并到返回结果中。
$row['name'] = $nbsp . $row['name'];
$row['level'] = $key; // 分类级别,0为顶级,1为二级,依此类推
$return[] = $row;
// 递归获取子分类
$r = $this->procCategory($sid, $row['cid']);
$return = array_merge($return, $r);
}
return $return;
性能评估与注意事项
上述代码能够正确构建简单的树形结构,适合数据量较小的场景。然而,由于每一层都需要发起一次数据库查询(N+1 查询问题),当分类层级很深或总数庞大时,递归效率会显著降低。在生产环境中,如果注重程序执行效率,建议先一次性查询出所有相关分类数据,然后在内存中使用 PHP 进行层级关联处理,或者对数据库查询进行优化合并。
总结
以上就是基于 PHP 递归实现树形菜单的详细内容,更多关于 PHP 无限级分类与数据库优化的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









