An interval is represented as a combination of start time and end time. Given a set of intervals, check if any two intervals intersect.
Examples:
$periods = [
['start_time' => "09:00", 'end_time' => '10:30'],
['start_time' => "14:30", "end_time" => "16:30"],
['start_time' => "11:30", "end_time" => "13:00"],
['start_time' => "10:00", "end_time" => "11:30"]
];
Expected time complexity is O(nLogn) where n is number of intervals.
/**
* Check the two time periods overlap
*
* Example:
* $periods = [
* ['start_time' => "09:00", 'end_time' => '10:30'],
* ['start_time' => "14:30", "end_time" => "16:30"],
* ['start_time' => "11:30", "end_time" => "13:00"],
* ['start_time' => "10:30", "end_time" => "11:30"],
* ]
*
* @param $periods
* @param string $start_time_key
* @param string $end_time_key
* @return bool
*/
public static function isOverlapped($periods, $start_time_key = 'start_time', $end_time_key = 'end_time')
{
// order periods by start_time
usort($periods, function ($a, $b) use ($start_time_key, $end_time_key) {
return strtotime($a[$start_time_key]) <=> strtotime($b[$end_time_key]);
});
// check two periods overlap
foreach ($periods as $key => $period) {
if ($key != 0) {
if (strtotime($period[$start_time_key]) < strtotime($periods[$key - 1][$end_time_key])) {
return true;
}
}
}
return false;
}
In this script, i use <=> Spaceship operator, you can check it here
Copy from Zeroblog
Top comments (0)