2016-08-29 12 views
1

私はこの問題の解決策を見つけようとしましたが、私の頭の中に道を見いだすことはできません。だからうまくいけば、誰かがこの問題。「利用可能です」という数字を数えてください

出力例を参照してください。私のコードの利用可能なタイムスロットの横に「利用可能です」と表示されますが、何とかしたいと思いますので、1日が完全に予約されていれば「利用可能な時間はありません」などと数えます。

私は$ i = 0と$ i ++を使っていくつかの解決策を試しましたが、私のように動作するようには思えません。以下のコードのための

出力例:

2015年11月18日9時00分00秒午前9時30分00秒2015年11月18日には

2015年11月18日09入手可能です。 30:00 10時30分00秒2015年11月18日に

2015年11月18日10時00分00秒利用可能である10時00分00秒2015年11月18日に

2015から11入手可能です-18 10:30:00〜2015-11-18 11:00:00

年11月18日午前12時00分○○秒

へ2015年11月18日11時30分00秒

2015年11月18日11時30分00秒に3210

2015年11月18日11時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時○○分○○秒2015年11月18日13時30分00秒には、2015年11月18日14:00

2015年11月18日13時30分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日夜三時00分00秒2015年11月18日午後03時30分00秒

2015年11月18日午後03時30分00秒に2015年11月18日16:00: 00が利用可能である

2015年11月18日午前16時00分00秒2015年11月18日16時30分00秒には、私はを使用

可能です上部に必要な炭素はです。

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

答えて

3

最後のforeachループの前にカウンタを追加します。

$available = 0; 

次にあなたが各エコー時間は、あなたが最後にその後に

$available++; 

を1を追加し、 "利用できます" ...

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

あなたが代わりにスケジュール項目のいずれかを示す、あなたの代わりに文字列のリストにあなたがエコーすべてのものを追加する必要がありますし、場合最後にそれを表示する「日が満室れる」見せたかったことを意味している場合$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."; 
} 
関連する問題