thinkphp6无限级分类,树状菜单

本文介绍了一种在ThinkPHP6框架下实现无限级菜单分类的方法,通过递归函数处理数据库查询结果,形成树状结构菜单,适用于官网首页的多级导航设计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值