2016-09-21 17 views
3

私は紹介システムで働いています。 ユーザーAがユーザーBとユーザーCを招待し、ユーザーBがユーザーDを招待し、ユーザーCがユーザーEを招待したとします。どのように私はすべての子供と孫のノードを反復することができますか?ここで指定された親IDからすべての子ノードと孫ノードを検索するPHP

私のデシベル

ID  name  referral_id 
1  user A  null//assume the tree starts from here 
2  user B  1 
3  user C  1 
4  user D  2 
5  user E  3 

の例のデータがどのように私は親として、ユーザAを取得し、ユーザーB(サブノードDを持つ)とユーザCを(ダウンリストが表示されます関数を作成することができていますサブノードE)?

このステップは..アルゴリズムのいくつかの種類をやった後、私はどこへ行くかわからない私はCIを使用していますが、これは親ID

$downline_query = $this->db->query("SELECT * FROM user WHERE referral_id = '1'") 
//above query will return user B and C as result.. hardcoded for example 

$downline = array(); 
foreach($downline_query as $result){ 
    $downline[] = array( 
     "name" => $result['name'], 
     "id" => $result['id'] 
    ); 
} 
//above $downline array will only contain user B and C. I don't know where to go again after this step.. 

$records = array("data"=>$downline); 
echo json_encode($records); 

から2サブノードを取得するために私のクエリです

whileループとforeachループを含みます。それはまだ "動的"ではありません。

私はちょうどすべての子供と孫の名前とIDが必要であることに注意してください。それは多次元配列である必要はありません。私はすべての子供を得ることができる限り、大男と大男はすでに大丈夫です。

私はすべての子供や孫などを$ downline配列に保存する予定です。だから、すべてが本当に..前にこの階層ブツをやったことがないこれを行う方法に関するガイダンスを必要とする..あなたに感謝:)

+2

を得ます。.. http://mikehillyer.com/articles/managing-hierarchicaをご覧ください。 l-data-in-mysql/..このリンクは非常に便利です。 –

+0

このリンクの質問を参照してください私の助けあなた。 [For Treeを作成する](http://stackoverflow.com/questions/34433056/unable-to-retrieve-the-sub-categories/34433727#34433727) – kc1994

+1

単一のループはこれでは機能しませんが、すべてにアクセスする必要がありますデータを整理しようとする前に、そうでない場合は、順序が間違っていればいくつか見逃してしまいます。最初のループではIDで、好ましくはそれをキーとして注文する必要があり、2番目のループでID/KEYによって最初の配列から関連するデータを取り出して2番目の配列を作成します。 – ArtisticPhoenix

答えて

0

これが何をすべき、$downline_queryがすべて含まれていると仮定すると、多次元配列

せずに1列になりますあなたが必要とする行IE 1 DBクエリ。

$affilites = []; 
$parents = [] 
foreach($downline_query as $row){ 
    if($row['referral_id']){ 
     if(!isset( $affilites[$row['referral_id']])){ 
      $affilites[$row['referral_id']] = []; 
     } 
     $affilites[$row['referral_id']][] = $row; 
    }else{ 
     $parents[$row['id']] = $row; 
    } 
} 
// you now have 2 arrays 1 of parents, one of children. now just combine (shown below) 
$parent = [ 
    1 => ['ID'=>1,'name'=>'user A', 'referral_id' =>null], 
]; 

$affiliate = [ 
    1 => [ 
      ['ID'=>2,'name'=>'user B', 'referral_id' =>1], 
      ['ID'=>3,'name'=>'user C', 'referral_id' =>1], 
     ], 
    2 => [['ID'=>4,'name'=>'user D', 'referral_id' =>2]], 
    3 => [['ID'=>5,'name'=>'user E', 'referral_id' =>3]], 
    5 => [['ID'=>16,'name'=>'user F', 'referral_id' =>5]], 
]; 


print_r(getparents($parent, $affiliate)); 

function getparents($parent, $affiliate){ 
    $result = []; 
    foreach ($parent as $row){ 
     $id = $row['ID']; 

     $result[] = $row; 

     if(isset($affiliate[$id])){ 
     //no children 
      $result[$id]['children'] = getparents($affiliate[$id], $affiliate); //recurse 
     } 
    } 
    return $result; 
} 

そして、最終的な出力

Array(
     [0] => Array(
       [ID] => 1 
       [name] => user A 
       [referral_id] => 
       [children] => Array(
         [0] => Array(
           [ID] => 2 
           [name] => user B 
           [referral_id] => 1 
           [children] => Array(
             [0] => Array(
               [ID] => 4 
               [name] => user D 
               [referral_id] => 2 
               ) 

             ) 

           ) 

         [1] => Array(
           [ID] => 3 
           [name] => user C 
           [referral_id] => 1 
           [children] => Array(
             [0] => Array(
               [ID] => 5 
               [name] => user E 
               [referral_id] => 3 
               [children] => Array(
                 [0] => Array(
                   [ID] => 16 
                   [name] => user F 
                   [referral_id] => 5 
                   ) 

                 ) 

               ) 

             ) 

           ) 

         ) 

       ) 

     ) 
+0

子ノードからすべての孫ノードへの反復? – Vinfoster0701

+0

いいえ、深いところでしか動作しません。それを行うには再帰的にする必要があります。しかし、その場合はネストされたセットやマテリアライズされたパスを使うほうが良いでしょう。親の子関係の代わりに階層があるためです。 – ArtisticPhoenix

+0

マテリアライズドパスは良い選択です。 – ArtisticPhoenix

-1

あなたは再帰関数試すことができます。

function get_referrals ($referral_id){ 
    $downline = array(); 
    $downline_query = $this->db->query("SELECT * FROM user WHERE referral_id = '$referral_id'"); 
    foreach($downline_query as $result){ 
     $downline[] = array(
      "name" => $result['name'], 
      "id" => $result['id'] 
     ); 
     $downline['invited'] = get_referrals($result['id']); # <--- recursive !!! 
    } 
    return $downline; 
} 

をし、あなたの$ダウンこのような構造のクエリのために

$downline = get_referrals(1); 


print_r($downline); 
+0

答えがSQLインジェクションの影響を受けやすいので、prepared statementを使うことをお勧めします。 'get_referrals(" '; DROP TABLE users; - ");' – ArtisticPhoenix

+0

It最終的なコードではありません。実装は開発者Vinfoster0701によって行われる必要があります。それは望ましい結果を生み出します。 – Federico

関連する問題