我想创建一个function来检查在将array $blocks合并到array $schedule时是否会有任何冲突
$schedule = [
'monday' => ['11:00-14:00'],
'tuesday' => ['10:30-12:00', '14:30-17:30'],
...,
];我希望function接受array $blocks并返回bool。假设我有这个$blocks
$blocks = [
'monday' => ['8:00-10:00', '15:00-16:00'],
'tuesday' => ['12:00-13:00']
]在这种情况下,function将返回true,因为在将$blocks合并到$schedule时不存在冲突。
但是,一旦function检测到任何冲突,它就应该返回false。例如:
$blocks = [
'monday' => ['8:00-10:00', '15:00-16:00'],
'tuesday' => ['11:00-12:30'],
'wednesday', => [...],
...,
]因此,不需要对$blocks进行进一步迭代。因为$blocks['tuesday'][0]和$schedule['tuesday'][0]之间已经存在冲突。
我需要帮助如何检查两个时间段的string,如果它冲突/重叠。任何帮助都将不胜感激。:)
发布于 2021-09-10 06:42:43
对于$blocks中的每个工作日,遍历其时间,并将开始和结束时间转换为可以比较的数字。对于这些对中的每一对,遍历每个匹配的$schedule工作日时间对,并比较它们是否重叠:
<?php
$schedule = [
'monday' => ['11:00-14:00'],
'tuesday' => ['10:30-12:00', '14:30-17:30'],
];
$blocks = [
'monday' => ['8:00-10:00', '15:00-16:00'],
'tuesday' => ['11:00-12:00']
];
function check_blocks( $schedule, $blocks ) {
foreach ( $blocks as $weekday => $block_times ) {
foreach ( $block_times as $block_t ) {
list( $block_t_start, $block_t_end ) = explode( '-', preg_replace( '/:/', '.', $block_t ) ); // e.g. 14.30, 17.30
foreach ( $schedule[$weekday] as $schedule_t ) {
list( $schedule_t_start, $schedule_t_end ) = explode( '-', preg_replace( '/:/', '.', $schedule_t ) ); // e.g. 14.30, 17.30
if (
// Schedule time starts between block time start and end
$schedule_t_start >= $block_t_start && $schedule_t_end <= $block_t_end
||
// Schedule time starts before block time and ends after block end (i.e. completely overlaps block time)
$schedule_t_start <= $block_t_start && $schedule_t_end >= $block_t_end
||
// Block time starts or ends between schedule time start and end
$block_t_start >= $schedule_t_start && $block_t_end <= $schedule_t_end
||
// Block time starts before schedule time start and ends after schedule time end (i.e. completely overlaps schedule time)
$block_t_start <= $schedule_t_start && $block_t_end >= $schedule_t_end
) {
return TRUE;
}
}
}
}
return FALSE;
}
$r = check_blocks( $schedule, $blocks );
var_dump($r); // TRUEhttps://stackoverflow.com/questions/69127712
复制相似问题