PHP中的项目递归列表,未知深度和节点

时间:2012-08-22 23:16:56

标签: php recursion tree

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

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

Table 'users'

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

要记住以下几点:

  1. 用户1和2是彼此的赞助/反对。
  2. 每个用户都可以拥有无​​限数量的侮辱。
  3. 每个用户的推荐也成为赞助商,并且还可以拥有无​​限数量的投票
  4. 深度是无限的。
  5. 任务是以递归方式构建单个“团队”的树,例如:

    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块中,但它仍然处于无限循环中。据我所知,当没有深度级别但是我无法理解如何计算/确定它时,我需要一个条件来退出递归。有什么建议吗?

1 个答案:

答案 0 :(得分:2)

保留用户ID,他们已经在某处建立了#34;正如你自己说的那样 - &#34;用户1和2是对方的赞助/反对。&#34;,所以有你的无限循环。

这样的东西
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;
}