问一个回调函数的问题?
在一个Foreach循环中调用一个回调函数
foreach ($towns as $key=>$val){
$areaIdArr = getChildAreaId($val['id']);
$result[$val['name']] = $worker::where('area_id','in',$areaIdArr)->count();
}
getChildAreaId为一个回调函数
function getChildAreaId($id){
static $area;
$area = $area ?? new \app\common\model\Area;
$result = collection($area->where(['pid'=>$id])->order('id desc')->select())->toArray();
static $res = [];
if($result){
foreach ($result as $key=>$val) {
$res[] = $val['id'];
getChildAreaId($val['id']);
}
}
return $res;
}
结果发现:在foreach每次循环中,getChildAreaId函数都会把上一次得到的结果再次带到下一次循环中。导致getChildAreaId取得的结果越来越多.......单独来调用getChildAreaId函数,是能得出正确的结果的!!!求解
回复
1个回答
test
2024-07-08
当你在方法内给一个变量添加了 static 修饰时,这个变量就变成了一个静态的变量,这个变量就会有一个持久化的状态(不会随函数调用而销毁),所以你下一次进来的时候 $res[] = 'xxx'
,就会在 $res
上继续加下去。
看你这里函数原来的目的应该是递归获取子级,你现在能做的就是重新写一个方法,或者把当前的这个 getChildAreaId 改造掉,不用这种方式。
回复
适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容