I just solved the problem like this.
$structuredSessions = collect($sessions
->groupBy(function ($session) {
return [
'year' => date('Y', strtotime($session['date'])),
];
})
->map(function ($sessions, $year) {
return [
'year' => $year,
'weeks' => $sessions
->groupBy(function ($session) {
return [
'week_number' => date('W', strtotime($session['date'])),
];
})
->map(function ($sessions, $weekNumber) use ($year) {
return [
'week_number' => $weekNumber,
'start_of_week' => Carbon::now()->setISODate($year, $weekNumber)->startOfWeek()->isoFormat('DD/MM'),
'end_of_week' => Carbon::now()->setISODate($year, $weekNumber)->endOfWeek()->isoFormat('DD/MM'),
'dates' => $sessions
->groupBy(function ($session) {
return [
'date' => Str::ucfirst(Carbon::parse($session->date)->locale('fr_FR')->isoFormat('dddd DD/MM')),
];
})
->map(function ($sessions, $key) {
return [
'date' => $key,
'sessions' => $sessions,
];
})
->values(),
];
})
->values(),
];
})
->values()
);
If you have any better suggestions, don't hesitate to share your ideas ;).