这里是菜单,针对于类似官网首页的菜单导航,因为不限制用户填写菜单的级别以及个数,所以需要做无限级分类,原理就是将所有数据查询出来,然后根据其父级id和级别id来进行遍历,并一边遍历一边增加级别id来反复查询,并将数据一一追加进之前的数据中:
//我的框架是thinkphp6 ,这个函数定义在common.php中
/**
* 无限分类-菜单
* @param $cate array 分类数据
* @param $joinStr string 连接符
* @param $pid int 父ID
* @param $level int 级别
* @return array
*/
function treeMenu($cate , $joinStr = '|— ' , $pid = 0 , $level = 0 ){
$arr = array();
foreach($cate as $k => $v){
if($v['menu_parentid'] == $pid) {
$joinStr = $level == 0 ? '' : '|-'; //判断是否是第一级分类
$v['menu_level'] = $level + 1;
$v['menu_name'] = $joinStr.$v['menu_name'];
$arr[] = $v;
unset($cate[$k]); //删除该节点,减少递归的消耗
$arr = array_merge($arr, treeMenu($cate, $joinStr, $v['menu_id'], $level + 1));
}
}
return $arr;
}
//这里是在其他控制器的调用
public function menuList()
{
//查询数据
$cate = Db::name('menu')->where('status','1')->order('menu_order asc')->select();
//调用函数
$cateTree = treeMenu($cate);
//渲染到页面
return view('menuList',[
'data'=>$cateTree //传递数据
]);
}
<ul>
{volist name='data' id='vo'}
<!--这里加padding-left样式是为了更能看出层级的效果-->
<li style="padding-left:{$vo['menu_level']*20}px">{$vo.menu_name}</li>
{/volist}
</ul>
输出结果如下:
我的数据表字段如下:
字段 | 类型 | 空 | 默认 | 注释 |
---|---|---|---|---|
menu_id | int(11) | 否 | ||
menu_name | varchar(50) | 是 | NULL | 菜单名称 |
menu_url | varchar(100) | 是 | # | 菜单链接 |
menu_order | int(11) | 是 | NULL | 菜单顺序 |
menu_parentid | varchar(50) | 是 | 0 | 父类id(0:一级/其他为下级) |
menu_level | tinyint(4) | 否 | 0 | 菜单级别 |
template | tinyint(4) | 否 | 2 | 所属模块(1:图片模块/2:文章模块/3:文件下载模块) |
file_upload | tinyint(4) | 否 | 0 | 是否开启多图上传 |
status | int(11) | 是 | 1 | 使用状态 |
add_time | int(11) | 否 | 0 | 添加时间 |