thinkphp6无限级分类,树状菜单
2022-11-24 11:10:29
168
{{single.collect_count}}

这里是菜单,针对于类似官网首页的菜单导航,因为不限制用户填写菜单的级别以及个数,所以需要做无限级分类,原理就是将所有数据查询出来,然后根据其父级id和级别id来进行遍历,并一边遍历一边增加级别id来反复查询,并将数据一一追加进之前的数据中:

//我的框架是thinkphp6 ,这个函数定义在common.php中/** * 无限分类-菜单 * @param$cate array分类数据 * @param$joinStrstring 连接符 * @param$pidint父ID * @param$levelint级别 * @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_idint(11)否   
menu_namevarchar(50)是 NULL 菜单名称 
menu_urlvarchar(100)是 菜单链接 
menu_orderint(11)是 NULL 菜单顺序 
menu_parentidvarchar(50)是 父类id(0:一级/其他为下级) 
menu_leveltinyint(4)否 菜单级别 
templatetinyint(4)否 所属模块(1:图片模块/2:文章模块/3:文件下载模块) 
file_uploadtinyint(4)否 是否开启多图上传 
statusint(11)是 使用状态 
add_timeint(11)否 添加时间 

 

回帖
全部回帖({{commentCount}})
{{item.user.nickname}} {{item.user.group_title}} {{item.friend_time}}
{{item.content}}
{{item.comment_content_show ? '取消' : '回复'}} 删除
回帖
{{reply.user.nickname}} {{reply.user.group_title}} {{reply.friend_time}}
{{reply.content}}
{{reply.comment_content_show ? '取消' : '回复'}} 删除
回帖
收起
没有更多啦~
{{commentLoading ? '加载中...' : '查看更多评论'}}