2016-08-29 1 views
1

이 문제에 대한 해결책을 찾아 내려고 노력했지만 실제로는 머리에 쓰이는 방법을 찾아 낼 수 없습니다. 따라서이 문제에 대한 간단하고 스마트 한 해결책이 있기를 바랍니다. .'사용할 수있는 금액'을 계산하십시오.

출력 예에서 알 수 있습니다. 내 코드의 사용 가능한 타임 슬롯 옆에 "사용 가능"이라고 표시되지만, 어떻게 든 작성하고 싶습니다. 따라서 하루가 충분하게 예약되어 있으면 "사용할 수있는 시간이 없습니다"와 같은 내용을 계산하거나 반향시킬 수 있습니다.

나는 $ i = 0을 사용하고 $ i ++를 사용하여 몇 가지 해결책을 시도했지만 실제로 그렇게 할 수는 없습니다. 아래 코드

출력 예 :

2015년 11월 18일 9시 0분 0초 9시 30분 0초 2015년 11월 18일로는

2015년 11월 18일 09로 볼 수 있습니다 : 30:00 2015년 11월 18일에 10시 0분 0초 사용할 수

2015년 11월 18일 10시 0분 0초 2015년 11월 18일에 10시 30분 0초 사용할 수 있습니다

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

년 11월 18일 12시 0분 0초

에 2015년 11월 18일 11시 30분 0초

2015년 11월 18일 11시 30분 0초에3210

2015년 11월 18일 11시 0분 0초

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

2015-11-18 12:30:00 to 2015-11-18 13:00:00 is available

2015년 11월 18일 13시 0분 0초 2015년 11월 18일에 13시 30분 0초는 2015년 11월 18일 14:00

2015년 11월 18일 13시 30분 0초 볼 수 있습니다 : 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시 0분 0초 2015년 11월 18일 15시 30분 0초

2015년 11월 18일 15시 30분 0초에 2015년 11월 18일 16:00 : 00 사용할 수

2015년 11월 18일 16시 0분 0초 2015년 11월 18일에 16시 30분 0초 내가 0,123,331,289을 사용

볼 수 있습니다 상단에 필요한 탄소는입니다.

<?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."; 
} 
관련 문제