- 昨天项目遇到一个问题就是产品提出一个需求,找出花名册里每个员工的部门全路径(本部门->上级部门->上上级部门->…),我刚接到需求感觉很简单,不就是个全路径嘛,于是写了一个递归宗谱寻找,结果遇坑。
遇坑代码
public static function fatherTree($arr,$id) {
static $Tree = array();
foreach($arr as $k=>$v) {
if($v['id'] == $id) {
$Tree[] = $v;
self::fatherTree($arr,$v['pid']);
}
}
return $Tree;
}
我拿到上面宗谱树开始放到员工花名册循环,结果把所有的部门都追加到了后面。打印发现我把部门存在了静态变量里,导致的坑。于是自己想各种解决办法,最后,在跟同事讨论时,同事提出一种叫做伪递归的概念。于是,我尝试操作,操作如下:
public static function getFather($arr, $id, &$data = [])
{
foreach($arr as $k=>$v) {
if($v['id'] == $id) {
$data[] = $v['deptName'];
if($v['parent_id'] != 0){
return self::getFather($arr,$v['parent_id'], $data);
} else {
return $data;
}
}
}
}
//或者这样,如下:
public static function getFather($arr, $id, $str = '')
{
foreach($arr as $k=>$v) {
if($v['id'] == $id) {
$str .= $v['deptName'].'-';
if($v['parent_id'] != 0){
return self::getFather($arr,$v['parent_id'], $str);
} else {
return $str;
}
}
}
}
- 我想大家都会问,为何说它高效呢?
- 我想给大家解释的是:
1.循环的每一次结果都没存在数组里,这样就不需要占用内存
2.我把每次的结果都返回,并且存在到一个引用地址的数组里,这样我只需根据引用地址去拿去数组即可。