Коли вам потрібно створити колекцію з певною кількістю обчислених елементів, метод times у Laravel стає елегантним розв'язанням. Цей метод особливо корисний для генерування послідовностей, часових слотів, лінків для пагінації або в будь-якому випадку, що вимагає нумерованих ітерацій.
// Генеруємо таблицю множення на 5
$fives = Collection::times(10, function ($number) {
return $number * 5;
});
// [5, 10, 15, 20, 25, 30, 35, 40, 45, 50]
Розглянемо практичний приклад розробки планувальника зустрічей, який генерує доступні часові слоти:
<?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
{
// Перевірка на наявність уже заброньованих слотів
return false;
}
}
Метод times спрощує створення послідовних даних, забезпечуючи чистий та ефективний спосіб формування колекцій з обчисленими значеннями