function getFreeTimeArray($timeArray, $reservArray, $duration, $nullDuration = 3) { $resultArray = null; $tmpArray[] = $timeArray; if (!empty($reservArray) && is_array($reservArray)) { foreach ($reservArray as $value) { if (!empty($tmpArray)) foreach ($tmpArray as $tmp_key => $tmp_val) { /* * reserved line * a|============|b * * time line * x|------------|y * * * a = $value['start'] * b = $value['end'] * * x = $tmp_val['start'] * y = $tmp_val['end'] */ /* if x>a && x>b * * a|====|b * * x|------|y * * * OR y * * a|====|b * * x|------|y * * * => reserved & time line not intersect */ if (($tmp_val['start'] > $value['start'] && $tmp_val['start'] > $value['end']) || ($tmp_val['end'] < $value['start'] && $tmp_val['end'] < $value['end'])) { } else { //reserved & time line intersect /* if x<=a && y>=b * * a|====|b * * x|------------|y * */ if ($tmp_val['start'] <= $value['start'] && $tmp_val['end'] >= $value['end']) { //if (ax) > nullDuration -> save data to array('start'=>x,'end'=>(a-1)) if (($value['start'] - $tmp_val['start']) > $nullDuration) $tmpArray[] = array('start' => $tmp_val['start'], 'end' => $value['start'] - 1); //if (yb) > nullDuration -> save data to array('start'=>(b+1),'end'=>y) if (($tmp_val['end'] - $value['end']) > $nullDuration) $tmpArray[] = array('start' => ($value['end'] + 1), 'end' => $tmp_val['end']); //delete this time interval unset($tmpArray[$tmp_key]); } /* if x>=a && y<=b * * a|==========|b * * x|------|y * */ else if ($tmp_val['start'] >= $value['start'] && $tmp_val['end'] <= $value['end']) { unset($tmpArray[$tmp_key]); } /* if x>=a && x<=b * * a|=====|b * * x|------------|y * */ else if ($tmp_val['start'] >= $value['start'] && $tmp_val['start'] <= $value['end']) { if (($tmp_val['end'] - $value['end']) > $nullDuration) $tmpArray[] = array('start' => ($value['end'] + 1), 'end' => $tmp_val['end']); unset($tmpArray[$tmp_key]); } /* if y>=a && y<=b * * a|=====|b * * x|----------|y * */ else if ($tmp_val['end'] >= $value['start'] && $tmp_val['end'] <= $value['end']) { if (($value['start'] - $tmp_val['start']) > $nullDuration) $tmpArray[] = array('start' => $tmp_val['start'], 'end' => ($value['start'] - 1)); unset($tmpArray[$tmp_key]); } } } } } // if result is not null // check duration in result data and sort array if (!empty($tmpArray)) { $tmpArray2 = null; foreach ($tmpArray as $val) { if ($duration <= ($val['end'] - $val['start'])) $tmpArray2[$val['start']] = $val; } ksort($tmpArray2); $tmpArray = $tmpArray2; } $resultArray = $tmpArray; return $resultArray; }
if($tmp_val['start'] < $value['end'] && $value['start'] < $tmp_val['end'])
Source: https://habr.com/ru/post/65184/
All Articles