Php 遍历相邻列表
我正在尝试获取指定上线下所有用户的列表。 例如,上线id 1的下线为(2,3,4,5,6) 我的桌子看起来像这样Php 遍历相邻列表,php,algorithm,codeigniter,Php,Algorithm,Codeigniter,我正在尝试获取指定上线下所有用户的列表。 例如,上线id 1的下线为(2,3,4,5,6) 我的桌子看起来像这样 +----------------------+-----+------+ | line_id | upline_id| downline_id| main_upline_id| +----------------------+-----+------+ | 1 | 0 | 1 | 0 | | 2 | 1 |
+----------------------+-----+------+
| 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);
@特林科特
你的方法有效!尽管我对它做了一个小的编辑,以将包含现有数据的数组传递给下一个递归调用,但我还是忽略了这一点
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从中删除重复的值
非常感谢 您的函数需要2个参数。您只提供1个。如果$data未成为非空数组,则函数不会返回任何内容。在foreach循环中,只返回调用函数$dataEdited中的第一个元素。仍然不返回任何内容,我是否没有正确执行遍历?请重新阅读前面的注释:您在第一次输入时退出
for
循环。其他迭代呢?如果没有孩子呢?那你什么都不还?这意味着递归调用程序也将不返回任何内容,…这不是范围问题<代码>$lineModel在该函数中不存在!例如,在打开PHP标记之后进行测试时,将其添加到文件顶部。即使您是在配置为LIVE的服务器上开发,现在也会看到任何错误$this->downline
代码中的任何内容都不会让我认为这是一个类/对象,因此$this
可能是一个错误更正了我的答案,因为它实际上没有收集当前子级。实际上,子级本身当然应该添加到输出数组中。