遍历相邻列表

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


叮当猫咪
浏览 102回答 2
2回答

呼啦一阵风

确保你的函数返回一些东西——在循环完成之后(而不是在——就像你在问题的第一个版本中那样)。尽管您传递 an 的$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);

慕哥6287543

你的方法有效!虽然我对它做了一个小的编辑,以将包含现有数据的数组传递给下一个递归调用。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 从中删除了重复的值。
打开App,查看更多内容
随时随地看视频慕课网APP