PHP多级分类循环实现问题:如何展示无限层级子分类
实现无限层级分类展示的解决方案
要实现无限层级分类,最直接的方式是用递归函数——让函数自己调用自己,不断处理当前分类的子分类,直到没有子分类为止。以下是具体实现步骤:
1. 编写递归渲染函数
创建一个递归函数,负责渲染指定父ID下的所有子分类,同时通过$indent参数控制缩进量,实现层级视觉区分:
<?php function renderCategories($conn, $parentId, $indent = 20) { // 获取当前父ID下的子分类 $sub_cat_list = retCatList($conn, $parentId); while($subCat = mysqli_fetch_assoc($sub_cat_list)) { // 输出带缩进的分类名称 ?> <h3 style="text-indent: <?php echo $indent; ?>px;"><?php echo $subCat['cat_name']; ?></h3> <?php // 递归调用,处理当前分类的子分类,缩进增加20px renderCategories($conn, $subCat['cat_id'], $indent + 20); } } ?>
2. 修改原有代码调用递归函数
保留顶级分类的查询逻辑,输出顶级分类后,调用递归函数处理其下的所有子分类:
<?php $sql = "SELECT * FROM categories WHERE cat_parent_id = '0' ORDER BY cat_name ASC;"; $stmt = mysqli_stmt_init($conn); if(!mysqli_stmt_prepare($stmt, $sql)){ // 这里添加错误处理逻辑 die("SQL prepare failed"); } mysqli_stmt_execute($stmt); $resultData = mysqli_stmt_get_result($stmt); while($row = mysqli_fetch_assoc($resultData)){ $cat_name = $row['cat_name']; $cat_id = $row['cat_id']; ?> <!-- 输出顶级分类,无缩进 --> <h3><?php echo $cat_name; ?></h3> <?php // 调用递归函数,处理当前顶级分类的所有子分类,初始缩进20px renderCategories($conn, $cat_id, 20); } ?>
关键说明
- 递归函数的核心是:处理完当前分类后,立即调用自身处理该分类的子分类,直到
retCatList返回空结果集(没有子分类)时停止递归。 $indent参数控制每一层级的缩进量,你可以根据需求调整每次增加的像素值,或者改用margin-left等其他样式属性。- 确保
retCatList函数能正确根据传入的父ID返回对应的子分类结果集,函数逻辑示例:
<?php function retCatList($conn, $parentId) { $sql = "SELECT * FROM categories WHERE cat_parent_id = ? ORDER BY cat_name ASC;"; $stmt = mysqli_stmt_init($conn); mysqli_stmt_prepare($stmt, $sql); mysqli_stmt_bind_param($stmt, "i", $parentId); mysqli_stmt_execute($stmt); return mysqli_stmt_get_result($stmt); } ?>
内容的提问来源于stack exchange,提问作者Snappysites
相关产品推荐
相关产品推荐

