У меня есть проблема, которая кажется довольно трудной для решения, поэтому я надеюсь, что у кого-то будет хорошее решение для меня 🙂
У меня есть программа 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 часов).
В конце концов, это говорит мне, сколько часов отель должен заплатить кому-то, чтобы проверить номера на случай, если у кого-то возникнет проблема.
Если у вас нет библиотеки, которая может мне помочь, алгоритм может быть хорошим началом.
Схема алгоритма:
<?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 минут (время – деньги).
Чтобы заказать номер, выберите час (00 til 23) и квартал (00; 15; 30; 45;)
Это работало для меня достаточно хорошо для бизнеса провайдера. Я думаю, это не так для отеля. Потому что идея временного промежутка одна и та же.
Но, конечно, вы можете искать какой-то класс, если вы вообще не хотите писать свой код.