Я бы начал с простой функции для проверки перекрытия 2 раза:
function isOverlap($s1, $e1, $s2, $e2) {
return (($s1 > $s2 && $s1 < $e2) || ($e1 > $s2 && $e1 < $e2)
|| ($s1 < $s2 && $e1 > $2) || ($s1 > $s2 && $e1 < $e2));
}
Это будет визуализация 4 случаев:
--- | --- | ------- | ---
--- | --- | --- | -------
Теперь просто заполните массив всех занятых комнат:
foreach($reservations as $res) {
if (isOverlap($time_start, $time_end, $res["start"], $res["end"]))
$busy_courtrooms[] = $res["id"];
}
Теперь вычислите разницу между всеми $courtrooms
и $busy_courtrooms
, используя array-diff :
$free_courtrooms = array_diff($courtrooms, $busy_courtrooms);
И вы сделали
Я не знаю, как строится ваш массив $reservations
, но я думаю, что он имеет атрибуты "start" и "end" ...