我对以下情况有意见:
我是通过递归函数来查询的,这是一棵有子用户的用户树。我将使用它作为一个附属系统。
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的直接子用户。
我希望你能理解我的意思。我想这很简单,但我看不见树木用的木头。
提前谢谢你,祝你圣诞快乐!
发布于 2016-12-23 20:24:01
您可以在此树中执行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)); /* [] */https://stackoverflow.com/questions/41305713
复制相似问题