当前位置:Gxlcms > PHP教程 > 递归调用-PHP递归获取数据

递归调用-PHP递归获取数据

时间:2021-07-01 10:21:17 帮助过:39人阅读

需求场景:通过公司某个部门的总监名称获取所有该部门的员工。
比如,通过总监获取所有副总监,再通过各个副总监获取所有各个副总监对应的经理,再通过经理获取对应经理的员工。
mysql的表结构这么设计的,总监的id是1,那么副总监的parent_id就是1,如果副总监的id分别是2、3、4、5等等,那么各个经理的parent_id就是2、3、4、5,依次类推形成一个递归的数据。
问1:PHP如何通过递归一次性把所有总监以下的数据保存到一个变量呢?
问2:取出数据后如何区分哪些是副总监哪些是经理哪些是一线员工呢?
问3:如何分页?(按照我的理解,即使是分页也需要把全部数据递归完毕之后再进行计算,而不是limit 1,10等形式分页)
问题有点多,还请各位大拿请教,多谢。

如下是我的代码。貌似死循环了。。。

public function recuresion($res)
    {
        foreach ($res as $k => $v)
        {
            $tmpRes[] = $this->obj->getResult($v['id']);  //假设通过该方法获取副总监、经理、员工
            if (!empty($tmpRes))
            {
                return $this->recuresion($tmpRes);
            }
            else
            {
                return $tmpRes;
            }
        }
    }
$a = recuresion($res);  //这里假设$res是获取的总监的数据
print_r($a);

回复内容:

需求场景:通过公司某个部门的总监名称获取所有该部门的员工。
比如,通过总监获取所有副总监,再通过各个副总监获取所有各个副总监对应的经理,再通过经理获取对应经理的员工。
mysql的表结构这么设计的,总监的id是1,那么副总监的parent_id就是1,如果副总监的id分别是2、3、4、5等等,那么各个经理的parent_id就是2、3、4、5,依次类推形成一个递归的数据。
问1:PHP如何通过递归一次性把所有总监以下的数据保存到一个变量呢?
问2:取出数据后如何区分哪些是副总监哪些是经理哪些是一线员工呢?
问3:如何分页?(按照我的理解,即使是分页也需要把全部数据递归完毕之后再进行计算,而不是limit 1,10等形式分页)
问题有点多,还请各位大拿请教,多谢。

如下是我的代码。貌似死循环了。。。

public function recuresion($res)
    {
        foreach ($res as $k => $v)
        {
            $tmpRes[] = $this->obj->getResult($v['id']);  //假设通过该方法获取副总监、经理、员工
            if (!empty($tmpRes))
            {
                return $this->recuresion($tmpRes);
            }
            else
            {
                return $tmpRes;
            }
        }
    }
$a = recuresion($res);  //这里假设$res是获取的总监的数据
print_r($a);

貌似纯 SQL 就能搞定,不需要 PHP 掺和……

问 1:

select  id,
        name,
        parent_id 
from    (select * from employee
         order by parent_id, id) sorted,
        (select @pv := '1') initialisation
where   find_in_set(parent_id, @pv) > 0
and     @pv := concat(@pv, ',', id)

问 2:
外面再套一层就好了:select * from (问 1 的 SQL) e1 where not exists (select * from employee e2 where e2.parent_id = e1.id)

问 3:
既然是纯 SQL 的话,直接 limit 分页就好了。

非要 PHP 的话:

public function recursion($res)
{
    $output = array();
    foreach ($res as $k => $v)
    {
        $tmpRes = $this->obj->getResult($v['id']);
        $output []= $v;
        if (!empty($tmpRes))
        {
            $output = array_merge($output, $this->recursion($tmpRes));
        }
    }
    return $output;
}
$a = recursion($res);

呵呵,既然你有如此个性化的需求,就应该有一个性化的专用表, 在你的表里面再加一个字段,int level ,level这个字段意义就是相对于顶级分类,自己这条记录是属于第几级分类,
如:
总监 的level 是 0
副总监 的level 是 1
经理 的level是 2
.....
插入记录的时候,应该能够知道。父记录的level是多少,然后+1以后存进数据库。

这样子就楼主的问题就简单了,
1,所有总监以下的员工就是level非0的记录。
2,通过level可以分清楚员工的类型,
3,分页,还是通过limit 0,10 这种方法分。

手机码字,排版不方便,请自己慢慢看

$tmpRes[]?不清空的话这数组越来越大

$result=array();
public function recuresion($res)
    {
        $tmpRes=array();
        foreach ($res as $k => $v)
        {
            $result[k]=$v;
            $tmpRes[] = $this->obj->getResult($v['id']);  //假设通过该方法获取副总监、经理、员工
           
        }
         if (!empty($tmpRes))
         {
               
             return $this->recuresion($tmpRes);
         }
            
    }

人气教程排行