这里是菜单,针对于类似官网首页的菜单导航,因为不限制用户填写菜单的级别以及个数,所以需要做无限级分类,原理就是将所有数据查询出来,然后根据其父级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_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 | 添加时间 |