這裏是菜單,針對於類似官網首頁的菜單導航,因爲不限制用戶填寫菜單的級別以及個數,所以需要做無限級分類,原理就是將所有數據查詢出來,然後根據其父級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) | 是 | 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 | 添加時間 |