2017-06-01 4 views
0

私はバイナリツリーの父のすべてのダウンラインを取得したい、各父は左右の腕を持って、各腕は左右の腕を持っています。 like the following image。 私のデータベースには、ユーザと呼ばれるテーブルがあり、各ユーザはLまたはRの父のIDと位置を持っています。アップラインのすべてのmlmダウンラインを取得

ここは私の機能ですが、まだすべてのダウンラインがありません。 like the following image

+0

これはかなり標準的なアルゴリズム上の問題のようです。私たちはあなたに何をして助けることができる? – Halcyon

+0

@Halcyon私は父親IDのすべてのダウンラインを取得するためにPHPスクリプトが必要です – Hamdy

+1

Stackoverflowは、賃貸マンション用のサイトではありません。特定の質問がある場合は、その質問に答えることができます。 – Halcyon

答えて

1

2つのことは私に目立つ:

  1. $i引数と$this->downline_id_arrの使用。

    $children = array(); 
    foreach($data as $row) { 
        $child_id = $row->id; 
        $children[$child_id] = array(/**/); 
        $children = array_merge($children, $this->getAllDownline($child_id); 
    } 
    return $childen; 
    

    を今、あなたは$i変数または$this->downline_id_arrは必要ありません:

がやって考えてみましょう。

  1. 各ノードを1つずつ照会しています。

ではなく、レベルによって照会考えてみましょう:

function getAllDownlines($fathers) { 
    $data = "SELECT * FROM users WHERE father_id IN (/*fathers*/)"; 
    $new_father_ids = array(); 
    $children = array(); 
    foreach ($data as $child) { 
     $children[$child->id] = array(/**/); // etc 

     $new_father_ids[] = $child->id; 
    } 
    $children = array_merge($children, $this->getAllDownlines($new_father_ids); 
    return $childen; 
} 

一般的に以下のクエリをより速くので、あなたがより良い性能を確認する必要があります。

関連する問題