为了账号安全,请及时绑定邮箱和手机立即绑定

遍历相邻列表

遍历相邻列表

PHP
叮当猫咪 2023-05-12 16:07:51
我正在尝试获取指定上线下所有用户的列表。例如,上线 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 回答

?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

确保你的函数返回一些东西——在循环完成之后(而不是在——就像你在问题的第一个版本中那样)。


尽管您传递 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);


查看完整回答
反对 回复 2023-05-12
?
慕哥6287543

TA贡献1831条经验 获得超10个赞

你的方法有效!虽然我对它做了一个小的编辑,以将包含现有数据的数组传递给下一个递归调用。


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


查看完整回答
反对 回复 2023-05-12
  • 2 回答
  • 0 关注
  • 97 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信