Получить свободный интервал из списка доступных может пригодиться, например, при организации записи к врачу или любой другой задачи где нужно выяснить «доступность» или наименьшую загруженность определённой даты или времени, что бы равномерно распределять нагрузку на временные интервалы.
Ниже пример функции, которая вернёт свободный или освободившийся интервал из списка разрешённых:
Пояснение:
- Из Базы данных необходимо (для этого примера) возвращать время в том же формате что и в переменной schedule
- Если нужно рассчитывать время по разным TimeZone (временным зонам). То при формировании запроса к базе данных, вы можете путём конвертирования все равно получить данные как schedule
- Остальное и подробно в комментариях к коду в коде ниже
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
function getFreeTimeForRecording() { //Доступные интервалы времени $schedule = [ '09:00:00', '09:15:00', '09:30:00', '09:45:00', '10:00:00', '10:15:00', '10:30:00', '10:45:00', '11:00:00', '11:15:00', '11:30:00', '11:45:00', '12:00:00', ]; $qb; //Какие то данные из БД, например обхект Doctrine $time = $schedule[0]; // Свободный интервал по умолчанию $busyTimeIntervals = []; //Занятые интервалы из базы данных в формате ЧЧ:MM:CC $queryResult = $qb->execute(); while ($tmp = $queryResult->fetch()){ $busyTimeIntervals[] = $tmp['busyTimeIntervals']; } // Сливаем интервалы, так как в БД может и не быть данных $busyTimeIntervals = array_merge($busyTimeIntervals, $schedule); // Обязательная сортировка данных из БД по возрастанию sort($busyTimeIntervals); // Интервалы по количеству использований $popularInterval = \array_count_values($busyTimeIntervals);// прим. ["09:00:00"=>1,"09:15:00" =>2...] // Удаление не валидного времени для корректного получения минимальной загруженности foreach ($popularInterval as $timeKey => $numPopular) { if (!in_array($timeKey,$schedule,true)) { // Если такого интервала нет в списке $schedule - значит он не валидный, например 11:54:00 unset($popularInterval[$timeKey]); } } $popularIntervalMin = min($popularInterval); //минимальная загруженность интервала // Выбор самого разгруженного интервала foreach ($popularInterval as $intervalUse => $numberUses) { // Так как интервал отсортирован по порядку, то перый из списка с наименьшой загрузкой будет тот который нужен, // для равномерного распределения очереди загруженности if ($numberUses === $popularIntervalMin) { $time = $intervalUse; break; } } return $time; // Свободный / Наименее нагруженный / Интервал по умолчанию } |