在做菜单栏目分类的时候经常遇到,现在记录一下,个人感觉很实用。
先看一下数据库:
写了一个接口获取数据:
public function test(){
$list = db('department')
->where('company_id=26')
->select();
}
return json(['code'=>200,'message'=>'获取成功', 'data' => $list]);
}
}
现在从数据库查到了如下数据:
data
0
id 1
company_id 26
dep_name "斑马售后部"
parent_id 0
1
id 3
company_id 26
dep_name "斑马开发部"
parent_id 0
2
id 4
company_id 26
dep_name "斑马销售部"
parent_id 0
3
id 7
company_id 26
dep_name "开发一部"
parent_id 3
4
id 10
company_id 26
dep_name "开发二部"
parent_id 3
5
id 12
company_id 26
dep_name "UI一部"
parent_id 3
6
id 14
company_id 26
dep_name "售后一部"
parent_id 1
7
id 23
company_id 26
dep_name "售后二部"
parent_id 1
8
id 28
company_id 26
dep_name "销售A组"
parent_id 4
9
id 29
company_id 26
dep_name "销售B组"
parent_id 4
10
id 33
company_id 26
dep_name "fdsaf"
parent_id 12
在前台做菜单的时候我们肯定不希望得到这样的数据,我们希望把父级菜单放到最顶部,在父栏目里有子栏目,子栏目有孙子栏目。。。。。这样可以无限分类下去。
看一下各个字段的关系,根据parent_id(父级id)可以找到父亲id。
下面开始写代码:
在Common.php里:
public function getTree($list,$pid)
{
$tree = array();
foreach($list as $k => $v)
{
if($v['parent_id'] == $pid)
{ //父亲找到儿子
$v['child'] = $this->getTree($list, $v['id']);
$tree[] = $v;
}
}
return $tree;
}
详细解释一下这段代码的意思,传的参数
l
i
s
t
是
查
询
到
的
整
个
表
里
的
数
据
,
list 是查询到的整个表里的数据,
list是查询到的整个表里的数据,pid是父级id,循环遍历得到的数组,如果parent_id=$pid的话找出来,就得到了父级的数据,再从父亲里面根据id招儿子,找到儿子继续从儿子里找孙子。。。。
然后引用getTree方法:
public function test(){
$list = db('department')
->where('company_id=26')
->select();
$tree = array();
if (is_array($list)) {
$tree = $this->getTree($list,0);
}
return json(['code'=>200,'message'=>'获取成功', 'data' => $tree]);
}
得到如下数据:
很显然这样就可以了。