1

大师!首先,我花了半天时间 googlin'n'stackoverflowing 但找不到解决方案。这是我第一次使用递归。希望有人可以提供帮助。

我有一个 MySQL 表,这是一种参考系统:

Table 'users'

ID   SPONSORID
---------
1    2         
2    1         
3    1         
4    1         
...  ...       

有几件事情要记住:

  1. 用户 1 和 2 是彼此的赞助商/推荐人。
  2. 每个用户可以有无限数量的推荐。
  3. 每个用户的推荐人也成为赞助商,并且还可以拥有无​​限数量的推荐人
  4. 深度是无限的。

任务是递归地构建单个“团队”的树,例如:

User 1
    User 2
        User 1
        User 5
             ...
                 ....
    User 3
        User 295
             User 356
                 ....
    User 4

等等...

这是我正在尝试做的事情:

$team = Array();
function build_team( $userID, $team ){
    if ( !in_array($userID, $team ) :
        // get 1st level of referals
        // returns associative array ('id', 'login', 'sponsorid')
        $referals = get_user_referals( $userID );
        for ( $i=0; $i<count($referals); $i++ ) :
            $team[] = $referals[$i];
            build_team( $referals[$i]['id'] );
        endfor;
    endif;
}

并且还尝试将该 IF 放在 FOR 块中,但它仍然处于无限循环中。据我了解,当没有深度级别但我不明白如何计算/确定它时,我需要一个条件来退出递归。有什么建议么?

4

1 回答 1

2

将已经“构建”的用户 ID 保存在某处。正如您自己所说的那样 - “用户 1 和 2 是彼此的赞助商/推荐人。”,所以有你的无限循环。

就像是

if (!in_array($userId, $already_looped_users){

  //continue loop...

}

添加一些代码:

$team = Array();
function build_team( $userID, $team ){
     if ( !in_array($userID, $team ) :
        // get 1st level of referals
        // returns associative array ('id', 'login', 'sponsorid')
        $referals = get_user_referals( $userID );
        if (count($referals) > 0){ //added this line
          for ( $i=0; $i<count($referals); $i++ ) :
              $team[] = $referals[$i];
              $team[$referals[$i] = build_team( $referals[$i]['id'], $team ); // i've edited this line
          endfor;
          return $team; 
        }
    endif;
}
于 2012-08-22T23:30:34.640 回答