Генерація послідовних колекцій у Laravel

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 15 січня, 2025
Вам цікаво дізнатися, як легко згенерувати колекцію з обчисленими значеннями в Laravel? У нашій статті ми розглянемо метод `times`, який стане вам у пригоді для створення послідовностей, вилучення вільних часових слотів і не тільки

Коли вам потрібно створити колекцію з певною кількістю обчислених елементів, метод 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 спрощує створення послідовних даних, забезпечуючи чистий та ефективний спосіб формування колекцій з обчисленими значеннями