用户树 - 获取某些阶段的所有用户

时间:2016-12-23 17:43:05

标签: php symfony recursion

我遇到以下情况的问题:

我通过递归函数获取具有子用户的用户树。我将它用于联盟系统。

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($ user,$ stage)来获取给定用户的某个阶段的所有用户。

想象一下,用户3和用户4也有一个子用户。通过调用getUsersByStage($ user,0),我想得到第一个维度的所有条目,在本例中是用户2,3和4。 通过调用getUsersByStage($ user,1),我想让所有这些用户更深一层,所以用户2,3和4的直接子用户。

我希望你理解我的意思。我认为这很简单,但我无法看到树木。

提前谢谢你,祝你圣诞快乐!

1 个答案:

答案 0 :(得分: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)); /* [] */