前言
在开发一后台的时候,遇到需要无极限的分类。经过三天三夜(没日没夜)摸索。终于解决的这波骚操作!!废话不多说,直接正题!
1、遇到的无极限分类需要两种情况。一种是栏目页的分类(如下图)
另一种是菜单栏的分类(图下图)
这是完全不一样的两种需求。
——————————开始表演 ↓
一、栏目页的分类
先看Column数据表
ID就是栏目的ID
UID是上级栏目的ID
代码解释:
$cols=AtnColumn::order('id')->select(); //查询Column数据表,用ID排序
$col=menu($cols); //查出来的数据交给公共函数处理!
公共类函数如下:
function menu($data,$uid=0,$level=0){
//$data 就是传过来的数据 $uid暂且为0 $level为栏目等级
static $arr=[]; //设置一个空数组 arr
//开始循环判断数据
foreach($data as $key=>$value) {
if ($value['uid'] == $uid) { //如果UID等于0,说明这是一个顶级栏目
$value["level"] = $level; //将栏目等级设为0级(也就是最高级)
$arr[] = $value; //放入数组 arr
unset($data[$key]); //销毁当前值
menu($data, $value['id'], $level + 1); //第一次循环所有0级的栏目,第二次循环所有1级栏目,知道最后一级。所以每次调用都需要 level+1
}
}
return $arr; //最后返回数组 arr
}
最后输出:
foreach($arr as $k=>$v){
if($vo['uid']!=0){ //如果栏目等级不为0
echo str_repeat(" ",$vo["level"]*6).'|一'.$v['cname'];
// $nbsp 是空格 ,repeat函数大概是重复输出
//重复输出多少个空格(栏目多少级就多少个)接上栏目名。就达到我们想要的效果
}
}
二、菜单的栏目分类 (懒了,直接上代码自己体会)
直接上代码:
$menuy=menuy(AtnColumn::select()->toArray());
//直接在数据库拿到数据然后传给 menuy函数
menuy函数代码如下:
function menuy($data,$uid=0){
$arr=[];
foreach ($data as $k=>$v){
if ($v['uid']==$uid){
$v['sub']=menuy($data,$v['id']);
$arr[]=$v;
unset($data[$k]);
}
}
return $arr;
}
最后前端页面输出代码如下:
function forlist($data){
$menu='';
foreach ($data as $k=>$v){
if(empty($v['sub'])){
$menu=$menu. '<li><a href="content?umark='.$v['umark'].'&cmark='.$v['cmark'].'"><span>'.$v['cname'].'</span></a></li>';
}else{
$menu=$menu. '<li class="has-sub-menu" ><a href="content?umark='.$v['umark'].'&cmark='.$v['cmark'].'"><i class="ti-package"></i><span>'.$v['cname'].'</span></a>
<ul class="side-header-sub-menu">'.forlist($v['sub']).'</ul>
</li>';
};
unset($data[$k]);
}
return $menu;
}