扁平递归
static public function getMenuAll(){
$result=self::where('hid',0)->select()->toArray();
return self::reSort($result);
}
// 递归对有的分类进行重新排序
static private function reSort($data, $pid=0, $level=0)
{
static $ret = array();
foreach ($data as $k => $v)
{
if($v['pid'] == $pid)
{
// 把level值放到这个分类里,这样就可以知道这个分类是第几级的
$v['level'] = $level;
$ret[] = $v;
// 再找这个分类的子分类
self::reSort($data, $v['id'], $level+1);
}
}
return $ret;
}
返回示例
image.png
树型递归
/**
* 获取所有菜单
* @return array
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
static public function getMenuAll(){
$res=self::where('hid',0)->field('id,pid,url,icon,title,sort,group')->order('pid', 'asc')->select()->toArray();
return self::makeArr($res);
}
/**
* 递归循环
* @param $res 总数组
* @param int $pid 父级id
* @return array
*/
static public function makeArr($res, $pid=0){
$arr = [];
$item['pid']=$pid;
$data=self::screen($res,$item);
foreach ($data as $key=>$val){
$ite['pid']=$val['id'];
$result = self::screen($res,$ite);
if (!empty($result)){
$val['child']= self::makeArr($res,$val['id']);
}
$arr[] = $val;
}
return $arr;
}
/**
* 数组键值对查询 返回查询数组
* @param $res
* @param $val
* @return array
*/
static public function screen($res,$val){
return array_filter($res,function ($var) use ($val){
if($var['pid']==$val['pid']) return true;
});
}
返回示例
image.png
树型递归优化
当$res 多的情况下,数组筛选性能会下降。优化思路是,设计两个变量,只查询使用过的变量。