您好,欢迎访问一九零五行业门户网

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

需求场景:通过公司某个部门的总监名称获取所有该部门的员工。
比如,通过总监获取所有副总监,再通过各个副总监获取所有各个副总监对应的经理,再通过经理获取对应经理的员工。
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') initialisationwhere find_in_set(parent_id, @pv) > 0and @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); } }
其它类似信息

推荐信息