Я собираюсь использовать комбинацию map()
и 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($item->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,
],
}