Пример выполнения тестового задания, PHP Developer. Работа с массивами и строками

Задание:

/**
 * @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');

Добавить комментарий