3 回答

TA贡献1793条经验 获得超6个赞
我将使用map()and 的组合mapToGroups(),我很确定一定有一种更简单的方法,但这对我来说很有趣:
$ranges = [ // the start of each age-range.
'18-24' => 18,
'25-35' => 25,
'36-45' => 36,
'46+' => 46
];
$output = User::applicant()
->get()
->map(function ($user) use ($ranges) {
$age = Carbon::parse($user->dob)->age;
foreach($ranges as $key => $breakpoint)
{
if ($breakpoint >= $age)
{
$user->range = $key;
break;
}
}
return $user;
})
->mapToGroups(function ($user, $key) {
return [$user->range => $user];
})
->map(function ($group) {
return count($group);
})
->sortKeys();
dd($output);
这背后的想法是为每个记录添加一个属性,其值对应于其年龄范围,然后按此键对它们进行分组,创建一组按范围分组的用户数组,最终计算此键内每个子数组的元素。
这应该返回如下内容:
=> Illuminate\Support\Collection {#2948
all: [
"25-35" => 1,
"36-45" => 2,
"46+" => 1,
],
}

TA贡献1775条经验 获得超11个赞
这是一个未经测试的解决方案(需要重构:
$groups = ['18-24' =>, '25-35', ..., '45'];
$applicants = User::applicant()->get();
$groups = collect($groups)
->map(function ($range, $key) use ($applicants) {
$rangeLimits = explode('-', $range);
$count = $applicants->filter(function ($applicant, $key) use ($rangeLimits) {
$age = Carbon::parse($applicant->dob)->age;
$verdict = $age >= $rangeLimits[0];
if (isset($rangeLimits[1])) {
$verdict = $age <= $rangeLimits[1];
}
return $verdict
})->count();
$range = ! isset($rangeLimits[1]) ? $range . '+' : $range;
return [ $range => $count ];
})->flatten()->all();
首先,您需要创建一组您需要的组,最后一组不应有+.
然后你会得到所有的申请者。
然后,您遍历每个组,找出申请人是否在其范围内,并获得计数。这被映射到结果数组。

TA贡献1820条经验 获得超2个赞
试试这个
$users = \DB::table('users')
->select(DB::raw('concat(10*floor(age/10), \'-\', 10*floor(age/10) + 9) as `range`, count(*) as `numberofusers`'))
->groupBy('range')
->get();
- 3 回答
- 0 关注
- 259 浏览
添加回答
举报