2016-12-23 4 views
1

私は次の場合に問題があります。ユーザツリー - 特定の段階のすべてのユーザを取得する

私は子ユーザを持つユーザのツリーを再帰関数で取得します。私はアフィリエイトシステムに使用します。

function getChildUsersRecursive($user, $users=array()) { 
    $em = $this->container->get('doctrine')->getManager(); 

    $user = $em->getRepository('AppBundle:User')->findOneById($user->getId()); 
    $childUsers = $user->getChildUsers(); 

    foreach ($childUsers as $childUser) { 

     if (!$childUser->getChildUsers()->isEmpty()) { 
      $users[$childUser->getId()] = $this->getChildUsersRecursive($childUser, $users); 
     } else { 
      $users[$childUser->getId()] = array(); 
     } 
    } 

    return $users; 
} 

これは問題なく動作します。結果はこのような配列である:

array:3 [ 
    2 => array:1 [ 
    6 => array:1 [ 
     7 => array:1 [ 
     8 => [] 
     ] 
    ] 
    ] 
    3 => [] 
    4 => [] 
] 

今私は、特定のユーザーのために特定のステージのすべてのユーザーを取得する機能getUsersByStage($ユーザー、$段階)を作成します。

ユーザー3とユーザー4に1人の子ユーザーがいるとします。 getUsersByStage($ user、0)を呼び出すと、最初の次元のすべての項目を取得したい、この例ではユーザー2,3および4です。 getUsersByStage($ user、1)を呼び出すと、ユーザー2、3、および4の直属の子供ユーザーです。

私はあなたが何を意味するか理解してくれることを願っています。私はシンプルだと思うが、私は木の木を見ることができない。

ありがとう、あなたにメリークリスマスがありがとう!

答えて

0

このツリーでBFSウォークを行い、指定された深さのユーザーを出力できます。以下の例では、特定のユーザーのユーザー配列が既に存在することを前提としています。

$a = [ 2 => [ 6=> [ 7=> [8=>[]]] ], 3 => [], 4 => [] ]; 


function getUsersByStage($users, $stage) 
{ 
    $usersFound = []; 
    $q = new \SplQueue(); 
    /* enqueue current array, level, user (key value) */ 
    $q->enqueue([$users, -1, -1]); 
    while (!$q->isEmpty()) { 
     $elem = $q->dequeue(); 
     $currentUserArray = $elem[0]; 
     $currentLevel = $elem[1]; 
     if ($currentLevel > $stage) break; 
     $currentUser = $elem[2]; 
     if ($currentLevel == $stage) $usersFound[] = $currentUser; 
     /* enqueue all children */ 
     foreach ($currentUserArray as $user=>$subArray) { 
      $q->enqueue([$subArray, $currentLevel+1, $user]); 
     } 
    } 
    return $usersFound; 
} 
print_r(getUsersByStage($a, 0)); /* [2, 3, 4] */ 
print_r(getUsersByStage($a, 1)); /* [6] */ 
print_r(getUsersByStage($a, 2)); /* [7] */ 
print_r(getUsersByStage($a, 3)); /* [8] */ 
print_r(getUsersByStage($a, 4)); /* [] */ 
+0

すばやくかわいい解決策をいただきありがとうございます、それは魅力的です! :) –