做菜单的时候,我们需要将拥有父子关系的数据,组成一个有层级关系的数组,方便我们渲染数据。一般我们的数据表会这么设计
| id | name | pid |
| --- | --- | --- |
| 1 | 江苏 | 0 |
| 2 | 南京 | 1 |
这样就可以清晰的记录好层级关系。下面依旧采取我之前用的地区表 area 来展示这个方法
~~~
/**
* 子孙树
* @param unknown $data
* @return unknown
*/
function subtree($data){
// 整理数组
foreach($data as $key=>$vo){
$res[$vo['id']] = $vo;
$res[$vo['id']]['children'] = [];
}
unset( $data );
// 查询子孙
foreach($res as $key=>$vo){
if( $vo['pid'] != 0 ){
$res[$vo['pid']]['children'][] = &$res[$key];
}
}
// 去除杂质
foreach($res as $key=>$vo){
if($vo['pid'] == 0){
$tree[] = $vo;
}
}
unset($res);
return $tree;
}
~~~
验证
~~~
$area = db('area')->select();
print_r(subtree($area));die;
~~~
整理格式如下:
![](https://box.kancloud.cn/fb1b02b1d404b73d7310f6d074b0386b_607x953.jpg)