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 に答える