查询菜单数据后的无限级递归处理函数

jerry thinkphp 2015年11月18日 收藏
通过一次查询所有菜单数据后再从结果中整理出等级层次关系的递归函数
这个方法只要是查询的数据含有pid字段的都可以用来实现分级整理
function arrayPidProcess($data,$res=array(),$pid='0'){//$level='0'){
    foreach ($data as $k => $v){
        if($v['pid']==$pid){
            $res[$v['id']]['info']=$v;
            $res[$v['id']]['child']=arrayPidProcess($data,array(),$v['id']);
        }
    }
    return $res;
}
求高手对这个递归的效率进行评估,求建议更好的方法
更新一下,添加了endlevel参数,作用为限制整理级数,默认值是‘0’为全整理,设置该参数可以限制只搜索到表level字段的级数,这样有效减低不必要的系统开支
function arrayPidProcess($data,$res=array(),$pid='0',$endlevel='0'){
    foreach ($data as $k => $v){
        if($v['pid']==$pid){
            $res[$v['id']]['info']=$v;
            if($endlevel!='0'){
                if($v['level']==$endlevel){
                    $child=null;
                }
                else{
                    $child=arrayPidProcess($data,array(),$v['id'],$endlevel);
                }
                $res[$v['id']]['child']=$child;
            }
            else{
                $child=arrayPidProcess($data,array(),$v['id']);
                if($child==''||$child==null){
                    $res[$v['id']]['child']=null;
                }
                else{
                    $res[$v['id']]['child']=$child;
                }
            }
            
        }
    }
    return $res;
}
应网友要求提供的使用例子:
function getMenu()
{
     $menu=M('admin_menu');
    $condition['status']='1';
    $res_menu=$menu->where($condition)->order('sort asc')->select();
    return arrayPidProcess($res_menu,array(),'0','2');
}
//查询数据整理递归函数(无限制级别)
function arrayPidProcess($data,$res=array(),$pid='0',$endlevel='0'){
    foreach ($data as $k => $v){
        if($v['pid']==$pid){
            $res[$v['id']]['info']=$v;
            if($endlevel!='0'){
                if($v['level']==$endlevel){
                    $child=null;
                }
                else{
                    $child=arrayPidProcess($data,array(),$v['id'],$endlevel);
                }
                $res[$v['id']]['child']=$child;
            }
            else{
                $child=arrayPidProcess($data,array(),$v['id']);
                if($child==''||$child==null){
                    $res[$v['id']]['child']=null;
                }
                else{
                    $res[$v['id']]['child']=$child;
                }
            }
            
        }
    }
    return $res;
}