blog_category
id smallint 不是null 主键 自增 无符号
name char 50 不是null EmptyString //查询用char空间换时间
parent_id small 不是null 0 //上级ID 0表示主ID
sort int 不是null 0 //上级ID 0表示主ID
is_show tinyint 不是null 1 //是否显示1显示 0不显示
我们给多点数据方便排序演示
控制器代码拿到数据集调用common公共文件中的方法 (递归方法写在公共文件中)
$db = Db::name('category');
$category = $db->order('sort')->select(); //获取了一段数据集
$category = category_merge($category);//开始使用递归方法
common.php代码
```
function category_merge($data,$parent_id=0,$level=0){
//该方法参1:数据集(db那边select的数据集) 参2:父id,0表示顶级 参三:层级
$res = [];
//空数组 留着合并数组使用
foreach ($data as $v){
if($v['parent_id']==$parent_id){
$v['level'] = $level;
$res[] = $v;
$res = array_merge($res,category_merge($data,$v['id'],$level+1));
}
}
return $res;
}
```
```
//递归的思路
//foreach遍历数据集 有多少条数据执行多少次
//每次查询中 列出pid=0就是顶级分类
//然后返回到该函数传递$v['id'](这是该顶级分的id值)
//得到顶级分类的id 我们该分类的子分类pid就是顶级分类的id值
//这时遍历一下啊数据集 条件是pid=我们传递顶级分类的id
//拿到得到的数据在合并到数组 在遍历查子分类的id 如果查询到继续合并 没有就跳出 主遍历次数
//继续数据集第一次条件遍历的下次遍历 依次类推实现递归
//array_merge() 函数把一个或多个数组合并为一个数组
```
再把$category数组传递给模板
通过递归方法我们会得到$category['level'] 层级 前端代码
str_repeat("Shanghai",5); 函数解释把字符串 "Shanghai " 重复 5 次:
还有一种思路层级敢 swich方法 case = 0 输出+--- case=1输出+------ 类推这种逻辑写
```
<select name="parent_id" class="select">
<option value="0">=作为一级分类=</option>
{foreach $category as $v}
<option value="{$v.id}"{if $row.parent_id == $v.id} selected{/if}>{:str_repeat(' ',$v['level'])}{$v.name} </option>
{/foreach}
</select>
```
