时间:2021-07-01 10:21:17 帮助过:39人阅读
如下是我的代码。貌似死循环了。。。
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);
}
}