PHP:生成具有开启和关闭时间(每天)的碳阵列

时间:2017-01-19 09:13:35

标签: php laravel date time php-carbon

期望的结果

我想要一个包含一系列时间(开始和结束时间之间)的关联数组,间隔为15分钟。例如:

[
    '2017-01-16' => [ // Start of the week (Monday)
        '08:00', // Opening time
        '08:15',
        '08:30',
        // Etc..
        '18:00', // Closing time
    ],
    '2017-01-17' => [ // Tuesday
        '10:00', // Opening time
        '10:15',
        '10:30',
        // Etc..
        '22:00', // Closing time
    ],

    // For every day in the week.
];

我希望能够做的另一件事是:花一段时间(例如09:00 - 10:00)并将其从数组中移除(在特定的日期键)

我所做的步骤(到目前为止)

我有一个看起来就像上面那个的数组。但是......它从00:00开始,到23:45结束。使用以下代码(主要来自Stackoverflow的另一个问题):

private function generateDateRange(Carbon $start_date, Carbon $end_date)
{
    $dates = [];

    while ($start_date->lte($end_date)) {

        if(! array_key_exists($start_date->format('Y-m-d'), $dates)) {
            $dates[$start_date->format('Y-m-d')] = [];
        } else {

            array_push($dates[$start_date->format('Y-m-d')], $start_date->format('H:i'));

            if(in_array($start_date->format('H:i'), $dates[$start_date->format('Y-m-d')])) {
                $start_date->addMinutes(15);
            } else {
                $start_date->addDay();
            }


        }
    }

    return $dates;
}

$start = Carbon::now()->startOfWeek();
$end = Carbon::now()->endOfWeek();

$range = $this->generateDateRange($start, $end);

我的问题

我如何在PHP(Laravel)中执行此操作?我打算通过使用数据库使这个(更多)动态。但首先我想要一个有效的基础。

有人知道我能做些什么来达到预期效果吗?

1 个答案:

答案 0 :(得分:1)

试试这个:

private function generateDateRange(Carbon $start_date, Carbon $end_date,$slot_duration = 15)
{
    $dates = [];
    $slots = $start_date->diffInMinutes($end_date)/$slot_duration;

    //first unchanged time
    $dates[$start_date->toDateString()][]=$start_date->toTimeString();

    for($s = 1;$s <=$slots;$s++){

        $dates[$start_date->toDateString()][]=$start_date->addMinute($slot_duration)->toTimeString();

    }

    return $dates;
}