我正在尝试获取指定上线下所有用户的列表。 例如,上线 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?
确保你的函数返回一些东西——在循环完成后(而不是在期间——就像你在问题的第一个版本中所做的那样(。
尽管您传递了一个带有填充它的想法的$array
,但您需要确保数组是通过引用传递的,为此您必须使用&
语法,否则调用方将看不到更改。
但是,我发现根本不指定该参数更干净(并且不建议使用 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);
@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从中删除了重复的值。
谢谢一堆!