如何从用户角色数组中统计ROLE_ADMIN的数量?
统计ROLE_ADMIN角色数量的解决方案
嘿,我来帮你搞定这个统计ROLE_ADMIN数量的问题!针对你的场景,我给你几种不同的实现思路,你可以根据实际情况选:
1. 遍历用户时直接统计(最省内存)
不用先把所有角色都存到数组里,在遍历用户的过程中直接判断计数,这样能节省不必要的内存开销,尤其用户量多的时候更明显:
$users = $this->entityManager->getRepository(User::class)->findAll(); $adminCount = 0; foreach ($users as $user) { // 检查当前用户是否拥有ROLE_ADMIN角色 if (in_array('ROLE_ADMIN', $user->getRoles())) { $adminCount++; } } return $adminCount;
2. 基于已有的$countUsers数组统计
如果你已经有了像示例里那样的$countUsers角色数组,也可以直接遍历这个数组来统计:
方法一:普通嵌套循环
$countUsers = [ [ "ROLE_SUPER_ADMIN" ], [ "ROLE_STRATEGIST", "ROLE_ADMIN" ], [ "ROLE_EDITOR" ], [ "ROLE_STRATEGIST", "ROLE_ADMIN" ] ]; $adminCount = 0; foreach ($countUsers as $roles) { if (in_array('ROLE_ADMIN', $roles)) { $adminCount++; } } // 示例数组会输出2 return $adminCount;
方法二:用array_reduce简化代码
喜欢简洁写法的话,可以用PHP的array_reduce函数来实现:
$countUsers = [ /* 你的角色数组 */ ]; $adminCount = array_reduce($countUsers, function($total, $roles) { // 每遇到含ROLE_ADMIN的用户数组,计数+1 return $total + (in_array('ROLE_ADMIN', $roles) ? 1 : 0); }, 0); return $adminCount;
3. 数据库层面直接统计(性能最优)
如果你的用户量比较大,不建议查所有用户再统计,直接在数据库层面做计数会高效很多。用Doctrine的QueryBuilder可以这样写:
$adminCount = $this->entityManager->createQueryBuilder() ->select('COUNT(u.id)') ->from(User::class, 'u') // 假设roles字段是JSON格式存储,用LIKE匹配包含ROLE_ADMIN的记录 ->where('u.roles LIKE :role') ->setParameter('role', '%"ROLE_ADMIN"%') ->getQuery() ->getSingleScalarResult(); return $adminCount;
如果你的roles字段是用其他格式存储(比如逗号分隔字符串),只需要调整where条件的匹配规则就行。
内容的提问来源于stack exchange,提问作者xihoj6
相关产品推荐
相关产品推荐

