如何编写递归函数遍历邻接表获取指定上级的所有下线用户ID
如何用递归函数获取指定Upline下的所有下线用户ID
刚好我之前也处理过类似的层级遍历需求,给你调整一下代码就能实现递归获取所有下线啦!
先理清楚逻辑:我们需要从指定的upline_id开始,先拿到它的直接下线,然后对每个直接下线再递归获取它们的下线,直到没有子节点为止,最后把所有收集到的下线ID整理成数组返回。
修改后的递归函数代码
public function downline($id, $array = []) { $lineModel = CLONEAPI::getModel( 'line' ); // 注意:这里要确保getAllById是根据upline_id来查询直接下线的方法 // 如果你的方法逻辑不是这样,得改成对应查询upline_id的方法,比如getDownlinesByUplineId($id) $data = $lineModel->getAllById($id); if (!empty($data)) { foreach ($data as $child) { // 把当前下线的ID加入结果数组(如果需要完整用户信息,直接存$child即可) $array[] = $child['downline_id']; // 递归调用:用当前下线的ID作为新的upline_id,继续获取它的下线 $array = $this->downline($child['downline_id'], $array); } } // 返回最终收集到的所有下线ID数组 return $array; }
关键细节说明
- 默认参数初始化:给
$array设了默认值[],这样调用的时候直接写$this->downline(1)就能获取upline=1的所有下线,不用手动传空数组 - 递归终止条件:当某个节点没有下线时(
$data为空),函数会直接返回当前的数组,递归就会逐层往上结束 - 方法逻辑确认:一定要保证
getAllById是根据传入的upline_id查询对应的直接下线记录,如果你的原方法是按line_id查询的,记得改成对应查询upline_id的方法,不然逻辑会出错 - 可选优化:如果担心有重复ID(虽然你的表结构看起来不会出现),可以在返回前加
return array_unique($array);来去重
调用示例
比如你要获取upline ID为1的所有下线,直接调用:
$allDownlines = $this->downline(1); // 结果会是 [2,3,4,5,6],和你预期的一致
内容的提问来源于stack exchange,提问作者benjamin wong
相关产品推荐
相关产品推荐

