遍历相邻列表

时间:2020-06-09 13:41:44

标签: 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       |   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?

2 个答案:

答案 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从中删除了重复的值。

谢谢!

相关问题