2016-08-28 62 views
0

問題是,我似乎無法確定一種方法來確保它不會輸出'可用'到已在$ events變量中使用的時間段。時間間隔可用

至於輸出的例子,你可以看到2015-11-18 10:00:00至2015-11-18 10:30:00它聲稱該插槽是可用的,但這不應該是可用的,因爲那裏是該時間段的事件。下面代碼

輸出例如:

2015年11月18日9時00分○○秒到2015年11月18日9點30分○○秒可用

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){ 
     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)){ 
       return false; 
      } 
     } 
     return true; 
    } 

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

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

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

回答

0

好像如果我加入=給它固定大部分的if語句的第一部分,我只是增加了一個額外的檢查if語句,如果$至已經超過$ schedule ['end'],所以它也解決了這個問題。

最終的代碼是這樣的。

<?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 />'; 
    } 
} 
?> 
0

if條件slotAvailable是錯誤的:你必須包括在間隔上>=<=的開始和結束。另外,我覺得它可以簡化爲:

if ($eventStart <= $from && $eventEnd >= $to) { 
    return false; 
} 
+0

似乎還給我一個問題,如果我改變$ reqInterval = new DateInterval('PT30M');到$ reqInterval = new DateInterval('PT45M'); – Nature