我遇到以下情况的问题:
我通过递归函数获取具有子用户的用户树。我将它用于联盟系统。
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的直接子用户。
我希望你理解我的意思。我认为这很简单,但我无法看到树木。
提前谢谢你,祝你圣诞快乐!
答案 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)); /* [] */