Php 遍历相邻列表

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 |

我正在尝试获取指定上线下所有用户的列表。 例如,上线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);
@特林科特

你的方法有效!尽管我对它做了一个小的编辑,以将包含现有数据的数组传递给下一个递归调用,但我还是忽略了这一点

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
可能是一个错误更正了我的答案,因为它实际上没有收集当前子级。实际上,子级本身当然应该添加到输出数组中。