Задание:
/**
* @charset UTF-8
*
* Задание 2. Работа с массивами и строками.
*
* Есть список временных интервалов (интервалы записаны в формате чч:мм-чч:мм).
*
* Необходимо написать две функции:
*
*
* Первая функция должна проверять временной интервал на валидность
* принимать она будет один параметр: временной интервал (строка в формате чч:мм-чч:мм)
* возвращать boolean
*
*
* Вторая функция должна проверять "наложение интервалов" при попытке добавить новый интервал в список существующих
* принимать она будет один параметр: временной интервал (строка в формате чч:мм-чч:мм)
* возвращать boolean
*
* "наложение интервалов" - это когда в промежутке между началом и окончанием одного интервала,
* встречается начало, окончание или то и другое одновременно, другого интервала
*
* пример:
*
* есть интервалы
* "10:00-14:00"
* "16:00-20:00"
*
* пытаемся добавить еще один интервал
* "09:00-11:00" => произошло наложение
* "11:00-13:00" => произошло наложение
* "14:00-16:00" => наложения нет
* "14:00-17:00" => произошло наложение
*/
Входные данные:
# Можно использовать список:
$list = array (
'09:00-11:00',
'11:00-13:00',
'15:00-16:00',
'17:00-20:00',
'20:30-21:30',
'21:30-22:30',
);
Решение задачи:
function conversion_time($tm)
{
$n = preg_match_all("!^([0-9][0-9]){1}:([0-9][0-9]){1}$!sUi", $tm, $res);
if($n>0) {
if( $res[1][0]<24 && $res[2][0]<60 ){
$minuts = $res[1][0]*60 + $res[2][0];
return $minuts;
}
}
return false;
}
function check_interval($time_inter)
{
$n = preg_match_all("!^([0-9][0-9]){1}:([0-9][0-9]){1}-([0-9][0-9]){1}:([0-9][0-9]){1}$!sUi", $time_inter, $res);
if($n>0) {
if( $res[1][0]>23 || $res[2][0]>59 || $res[3][0]>23 || $res[4][0]>59 ){
return false;
}
if( ( conversion_time($res[3][0].':'.$res[4][0]) - conversion_time($res[1][0].':'.$res[2][0]) ) <= 0) {
return false;
}
} else {
return false;
}
return true;
}
function check_intersection($intrvl) {
global $list;
$isValid = check_interval($intrvl);
if($isValid === false)
return false;
for($i=0;$i<count($list);$i++) {
$n = preg_match_all("!^([0-9][0-9]){1}:([0-9][0-9]){1}-([0-9][0-9]){1}:([0-9][0-9]){1}$!sUi", $list[$i], $res);
if($n>0) {
$n2 = preg_match_all("!^([0-9][0-9]){1}:([0-9][0-9]){1}-([0-9][0-9]){1}:([0-9][0-9]){1}$!sUi", $intrvl, $res2);
if($n2>0) {
if( ( conversion_time($res2[3][0].':'.$res2[4][0]) <= conversion_time($res[1][0].':'.$res[2][0]) ) ||
( conversion_time($res2[1][0].':'.$res2[2][0]) >= conversion_time($res[3][0].':'.$res[4][0]) ) ) {
echo($intrvl.' наложения нет '.$list[$i].'<br>');
}else {
echo($intrvl.' произошло наложение, возвращено false '.$list[$i].'<br>');
return false;
}
}
}
}
$list[] = $intrvl;
echo 'Добавлен элемент массива '.$intrvl.' в массив $list, возвращено true' ;
return true;
}
check_intersection('14:00-15:30');