thinkphp6⽆限级分类,树状菜单
这⾥是菜单,针对于类似官⽹⾸页的菜单导航,因为不限制⽤户填写菜单的级别以及个数,所以需要做⽆限级分类,原理就是将所有数据查询出来,然后根据其⽗级id和级别id来进⾏遍历,并⼀边遍历⼀边增加级别id来反复查询,并将数据⼀⼀追加进之前的数据中:
//我的框架是thinkphp6 ,这个函数定义在common.php中
/**thinkphp3
* ⽆限分类-菜单
* @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 >{$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 添加时间

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。