When you need to create a collection with a specific number of calculated elements, Laravel's times method provides an elegant solution. This method is particularly useful for generating sequences, time slots, pagination links, or any scenario requiring numbered iterations.
// Generate multiplication table of 5$fives = Collection::times(10, function ($number) { return $number * 5;});// [5, 10, 15, 20, 25, 30, 35, 40, 45, 50]
Let's explore a practical example of a meeting scheduler that generates available time slots:
<?php namespace App\Services; use Carbon\Carbon;use Illuminate\Support\Collection; class MeetingScheduler{ public function generateTimeSlots(Carbon $date, array $config = []): Collection { $startTime = $config['start_time'] ?? '09:00'; $endTime = $config['end_time'] ?? '17:00'; $duration = $config['duration'] ?? 30; $slots = $this->calculateSlotCount($startTime, $endTime, $duration); return Collection::times($slots, function ($slot) use ($date, $startTime, $duration) { $start = Carbon::parse($date->format('Y-m-d') . ' ' . $startTime) ->addMinutes(($slot - 1) * $duration); $end = $start->copy()->addMinutes($duration); return [ 'id' => $slot, 'start_time' => $start->format('H:i'), 'end_time' => $end->format('H:i'), 'formatted' => sprintf( '%s - %s', $start->format('g:i A'), $end->format('g:i A') ), 'is_available' => !$this->isSlotBooked($start, $end) ]; }); } private function calculateSlotCount($start, $end, $duration): int { $startMinutes = Carbon::parse($start)->diffInMinutes(Carbon::parse($end)); return (int) floor($startMinutes / $duration); } private function isSlotBooked(Carbon $start, Carbon $end): bool { // Check against existing bookings return false; }}
The times method simplifies the process of generating sequential data, providing a clean and efficient way to create collections with calculated values.
