thinkphp6无限级分类,树状菜单

这里是菜单,针对于类似官网首页的菜单导航,因为不限制用户填写菜单的级别以及个数,所以需要做无限级分类,原理就是将所有数据查询出来,然后根据其父级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) 是  父类id(0:一级/其他为下级) 
menu_level tinyint(4) 否  菜单级别 
template tinyint(4) 否  所属模块(1:图片模块/2:文章模块/3:文件下载模块) 
file_upload tinyint(4) 否  是否开启多图上传 
status int(11) 是  使用状态 
add_time int(11) 否  添加时间 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章