计算可用的金额'

时间:2016-08-29 16:39:31

标签: php date datetime time

我试图找出解决这个问题的方法,但似乎无法找到解决问题的方法,所以希望有人能为这个问题找到一个简单而智能的解决方案。

正如您可以看到的输出示例。它呼应了#34;可用"在我的代码的可用时间段旁边,但我想以某种方式制作,所以我可以计算或回应类似于"没有可用的时间",如果一天已经完全预订。

我尝试过使用$ i = 0然后使用$ i ++的一些解决方案,但似乎无法让它像我一样工作。

以下代码的输出示例:

  

2015-11-18 09:00:00至2015-11-18 09:30:00可用

     

2015-11-18 09:30:00至2015-11-18 10:00:00可用

     

2015-11-18 10:00:00至2015-11-18 10:30:00可用

     

2015-11-18 10:30:00至2015-11-18 11:00:00

     

2015-11-18 11:00:00至2015-11-18 11:30:00

     

2015-11-18 11:30:00至2015-11-18 12:00:00

     

2015-11-18 12:00:00至2015-11-18 12:30:00

     

2015-11-18 12:30:00至2015-11-18 13:00:00可用

     

2015-11-18 13:00:00至2015-11-18 13:30:00可用

     

2015-11-18 13:30:00至2015-11-18 14:00:00可用

     

2015-11-18 14:00:00至2015-11-18 14:30:00可用

     

2015-11-18 14:30:00至2015-11-18 15:00:00

     

2015-11-18 15:00:00至2015-11-18 15:30:00

     

2015-11-18 15:30:00至2015-11-18 16:00:00可用

     

2015-11-18 16:00:00至2015-11-18 16:30:00可用

我使用http://carbon.nesbot.com/作为顶部所需的碳。

<?php
require 'Carbon.php';
use Carbon\Carbon;

$schedule = [
    'start' => '2015-11-18 06:00:00',
    'end' => '2015-11-18 18:00:00',
];

$start = Carbon::instance(new DateTime($schedule['start']));
$end = Carbon::instance(new DateTime($schedule['end']));

$minInterval = new DateInterval('PT30M');
$reqInterval = new DateInterval('PT45M');

$events = [
    [
        'created_at' => '2015-11-18 10:00:00',
        'updated_at' => '2015-11-18 13:00:00',
    ],
    [
        'created_at' => '2015-11-18 14:00:00',
        'updated_at' => '2015-11-18 16:00:00',
    ],
];

function slotAvailable($from, $to, $events, $workEnd){
    foreach($events as $event){
        $eventStart = new DateTime($event['created_at']);
        $eventEnd = new DateTime($event['updated_at']);

        if(($from >= $eventStart && $to <= $eventEnd) || ($from < $eventEnd && $to > $eventEnd) || ($from < $eventStart && $to > $eventStart) || ($to > $workEnd)){
            return false;
        }
    }
    return true;
}

foreach(new DatePeriod($start, $minInterval, $end) as $slot){
    $to = $slot->copy()->add($reqInterval);
    $workEnd = $schedule['end'];

    echo $slot->toDateTimeString() . ' to ' . $to->toDateTimeString();

    if(slotAvailable($slot, $to, $events, $workEnd)){
        echo ' is available';
    }
    echo '<br />';
    }
}
?>

1 个答案:

答案 0 :(得分:3)

在最后一个foreach循环之前添加一个计数器。

$available = 0;

然后每当你回复&#34;可用&#34;你加1吧

$available++;

然后在最后......

if ($available == 0) echo "Day is fully booked";

如果你的意思是你想要表演&#34; Day已经完全预订了#34;您应该将所有回显的内容添加到字符串列表中,而不是显示任何计划项目,如果$available > 0,则将其显示在最后。

$output = array();

...

// change all instances of echo ... to something like this...
// echo $slot->toDateTimeString() . ' to ' . $to->toDateTimeString();
array_push($output, $slot->toDateTimeString() . ' to ' . $to->toDateTimeString());

...

if ($available > 0) {
    foreach ($output as $item) {
        echo $item;
    }
} else {
    echo "Schedule is fully booked.";
}