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) 否  添加時間 

 

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