我正在尝试获取指定上行线路下所有用户的列表。 例如。上线ID 1下线为(2,3,4,5,6)
我的桌子看起来像这样。
+----------------------+-----+------+
| line_id | upline_id| downline_id| main_upline_id|
+----------------------+-----+------+
| 1 | 0 | 1 | 0 |
| 2 | 1 | 2 | 1 |
| 3 | 2 | 3 | 1 |
| 4 | 3 | 4 | 1 |
| 5 | 1 | 5 | 1 |
| 6 | 5 | 6 | 1 |
| 7 | 0 | 7 | 0 |
| 8 | 7 | 8 | 7 |
| 9 | 8 | 9 | 7 |
| 10 | 9 | 10 | 7 |
+----------------------+-----+------+
还有我的代码
public function downline($id, $array) {
$lineModel = CLONEAPI::getModel( 'line' );
$data = $lineModel->getAllById($id);
if (sizeof($data) != 0 )
{
foreach ($data as $child)
{
$array[] = $child;
// How do i rerun the loop until no more downline ids are found without writing a bunch of foreach loops?
}
}
}
如何编写递归函数以获取所有相关的下线ID?
答案 0 :(得分:1)
确保您的函数在循环完成后(而不是在问题的第一个版本中)返回某些内容。
尽管您传递了一个$array
的想法来填充它,但是您需要确保该数组是通过引用传递的,为此必须使用&
syntax,否则调用者将看不到变化。
但是,我发现根本不指定该参数更干净(并且不建议使用PHP的&
语法-它具有奇怪的副作用)。而是让函数返回数组。递归调用此函数的代码,然后应采用返回的数组,并将其与自身收集的内容合并:
public function downline($id) {
$lineModel = CLONEAPI::getModel('line');
$data = $lineModel->getAllById($id);
$array = [];
foreach ($data as $child) {
$array[] = $child['downline_id'];
$array = array_merge($array, downline($child['downline_id']);
}
return $array;
}
$result = downline($someParentId);
答案 1 :(得分:0)
@trincot
您的方法有效!我虽然对其进行了一些小的编辑,但将带有现有数据的数组传递给下一个递归调用。
public function downline($id) {
$lineModel = CLONEAPI::getModel('line');
$data = $lineModel->getAllById($id);
$array = [];
foreach ($data as $child) {
$temp[] = $child['downline_id'];
$array = array_merge($array, $temp, downline($child['downline_id']);
}
return $array;
}
$result = downline($someParentId);
之后,我得到了一些重复的ID,我使用array_unique从中删除了重复的值。
谢谢!