@lemonlimelike

Как найти свободные интервалы?

Всем привет! Есть задача найти свободные интервалы времени.

Написал такой метод:
private function getFreeInterval($intervals, $startTime, $endTime)
    {
        foreach($intervals as $key => $value){
            $value = explode('-', $value);
            
            $intervalOne = new \DateTime($value[0]);
            $intervalTwo = new \DateTime($value[1]);

            if ($intervalOne >= $startTimeItem && $endTimeItem <= $intervalTwo){
                $intervals[] = "{$intervalOne->format('H:i:s')}-{$startTimeItem->format('H:i:s')}";
                $intervals[] = "{$endTimeItem->format('H:i:s')}-{$intervalTwo->format('H:i:s')}";
                unset($intervals[$key]);
                // dd($endTimeItem, $intervalTwo, $intervalOne, $startTimeItem);
                break;
            }
        }

        return $intervals;
    }


Метод выполняет следующую функцию:
на вход к нему приходит список интервалов, такие вот:
array:2 [
  0 => "09:30:00-13:15:00"
  1 => "14:00:00-17:00:00"
]

Это список свободных интервалов, то есть между 13:15:00 и 14:00:00 уже занято, остальное как бы свободно

Так же в метод передается переменные startTime и endTime, в которых конец и начало записи клиента.

И нужно чтобы метод постоянно возвращала правильный список. В данном моменте метод возвращает правильный результат лишь один раз. То есть, если ее запустить, то вернется какой-то список интервалов состоящий из трех элементов. Затем если эти три элемента опять передать методу и поставить какие-то start и end time, то методы уже вернет неверный результат.

Вот что получаю при первом ее запуске, если передаю этот массив
array:2 [
  0 => "09:30:00-13:15:00"
  1 => "14:00:00-17:00:00"
]

затем начало такое: 09:30:00 и конец 10:15:00, то вот что возвращает:

array:3 [
1 => "14:00:00-17:00:00"
2 => "09:30:00-09:30:00"
3 => "10:15:00-13:15:00"
]


То что во втором элементе массива тоже неправильно, наверное.

И дальше.. если передать уже этот массив, что только что пришел, и start = 10:30:00 и end = 11:15:00
То вот какой результат щас:
array:4 [
  1 => "09:30:00-09:30:00"
  2 => "10:15:00-13:15:00"
  3 => "14:00:00-10:30:00"
  4 => "11:15:00-17:00:00"
]


Вот, не понятно откуда там 10:15:00-13:15:00 если их там не должно быть
там должен быть интервал 10:15:00-10:30:00, 11:15:00-13:15:00 и 14:00:00-17:00:00

Как эту проблему решить? Может у меня вообще не та реализация?
  • Вопрос задан
  • 131 просмотр
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
function getFreeInterval($intervals, $startTime, $endTime)
{
    $result = [];
    $ok = false;
    foreach($intervals as $key => $interval){
        list($start, $end) = explode('-', $interval);
        if ($startTime >= $start && $endTime <= $end) {
            $ok = true;
            if ($startTime > $start) {
                $result[] = "{$start}-{$startTime}";
            }
            if ($endTime < $end) {
                $result[] = "{$endTime}-{$end}";
            }
        } else {
            $result[] = $interval;
        }
    }
    return [
        $ok,
        $result
    ];
}

$intervals = [
  '09:30:00-13:15:00',
  '14:00:00-17:00:00'
];

list($ok, $result) = getFreeInterval($intervals, '09:30:00', '10:15:00');

var_dump($ok, $result);

// bool(true)
// array(2) {
//   [0]=> string(17) "10:15:00-13:15:00"
//   [1]=> string(17) "14:00:00-17:00:00"
// }
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
29 мар. 2024, в 11:11
10000 руб./за проект
29 мар. 2024, в 10:00
10000 руб./за проект
29 мар. 2024, в 09:59
750 руб./в час