PHP – Калькуляция недоступных часов в календаре / повестке дня

У меня есть проблема, которая кажется довольно трудной для решения, поэтому я надеюсь, что у кого-то будет хорошее решение для меня 🙂

У меня есть программа PHP со списком резервирования для многих конференц-залов отеля. Мне нужно рассчитать, сколько времени в течение дня используется как минимум 1 конференц-зал.

Вот пример:

Room 1: 10h 00 to 13h 00 Room 2: 11h 00 to 14h 00 Room 3: 15h 00 to 16h 00 

С номерами тезисов мне нужно рассчитать, что отель используется в течение 5 часов (с 10 часов до 14 часов и с 15 часов до 16 часов).

В конце концов, это говорит мне, сколько часов отель должен заплатить кому-то, чтобы проверить номера на случай, если у кого-то возникнет проблема.

Если у вас нет библиотеки, которая может мне помочь, алгоритм может быть хорошим началом.

Схема алгоритма:

  1. Закажите промежутки времени, начиная время.
  2. Пройдите через них и присоединитесь к соседям, которые пересекаются. Условие пересечения будет состоять в том, что время начала второго интервала перед или равно времени окончания первого интервала. Из-за заказа потребуется только один цикл.
  3. На данный момент у вас есть только непересекающиеся интервалы, и вы можете суммировать их промежутки, чтобы получить общий диапазон.

И вот реализация этого алгоритма:

 <?php // assuming hh:mm format for all the dates // $intervals = array( array( 'start' => '15:30', 'end' => '16:00', ), array( 'start' => '10:00', 'end' => '13:00', ), array( 'start' => '15:00', 'end' => '16:09', ), array( 'start' => '11:00', 'end' => '14:00', ), ); // 1. sort the intervals by start date // function mySortIntervals($a, $b){ return $a > $b; } usort($intervals, 'mySortIntervals'); // 2. merge adjoining intervals // $active = 0; $current = 1; $length = count($intervals); while($current < $length){ if($intervals[ $current ]['start'] <= $intervals[ $active ]['end']){ $intervals[ $active ]['end'] = max($intervals[ $active ]['end'], $intervals[ $current ]['end']); unset($intervals[ $current ]); } else{ $active = $current; } $current++; } // 3. cout the total time // $time = 0; foreach($intervals as $interval){ $time += strtotime($interval['end']) - strtotime($interval['start']); } // output // echo str_pad((int) ($time/60/60), 2, '0', STR_PAD_LEFT).':'; echo str_pad((int) (($time/60)%60), 2, '0', STR_PAD_LEFT); ?> 

Прежде всего, вам нужно определить интервал или временной интервал, например каждые 15 минут. Почему это? потому что вам нужно контролировать промежутки, вызванные комнатой, которая заканчивается до времени или по какой-то другой причине.

Временной интервал не может превышать 15 минут (время – деньги).

  1. Закажите номер (промежуток времени). Он должен проверять доступный временной интервал каждый раз, когда происходит запрос.
  2. Как только ячейка (временной интервал) будет проверена, что временной интервал больше не будет доступен.

Чтобы заказать номер, выберите час (00 til 23) и квартал (00; 15; 30; 45;)

Это работало для меня достаточно хорошо для бизнеса провайдера. Я думаю, это не так для отеля. Потому что идея временного промежутка одна и та же.

Но, конечно, вы можете искать какой-то класс, если вы вообще не хотите писать свой код.