Answer the question
In order to leave comments, you need to log in
How to find free intervals?
Hello! There is a task to find free intervals of time.
Wrote this method:
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"
]
array:2 [
0 => "09:30:00-13:15:00"
1 => "14:00:00-17:00: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"
]
Answer the question
In order to leave comments, you need to log in
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"
// }
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question