首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何检查时间段的冲突/重叠

如何检查时间段的冲突/重叠
EN

Stack Overflow用户
提问于 2021-09-10 05:38:35
回答 1查看 58关注 0票数 2

我想创建一个function来检查在将array $blocks合并到array $schedule时是否会有任何冲突

代码语言:javascript
复制
$schedule = [
   'monday' => ['11:00-14:00'],
   'tuesday' => ['10:30-12:00', '14:30-17:30'],
   ...,
];

我希望function接受array $blocks并返回bool。假设我有这个$blocks

代码语言:javascript
复制
$blocks = [
   'monday' => ['8:00-10:00', '15:00-16:00'],
   'tuesday' => ['12:00-13:00']
]

在这种情况下,function将返回true,因为在将$blocks合并到$schedule时不存在冲突。

但是,一旦function检测到任何冲突,它就应该返回false。例如:

代码语言:javascript
复制
$blocks = [
   'monday' => ['8:00-10:00', '15:00-16:00'],
   'tuesday' => ['11:00-12:30'],
   'wednesday', => [...],
   ...,
]

因此,不需要对$blocks进行进一步迭代。因为$blocks['tuesday'][0]$schedule['tuesday'][0]之间已经存在冲突。

我需要帮助如何检查两个时间段的string,如果它冲突/重叠。任何帮助都将不胜感激。:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-10 06:42:43

对于$blocks中的每个工作日,遍历其时间,并将开始和结束时间转换为可以比较的数字。对于这些对中的每一对,遍历每个匹配的$schedule工作日时间对,并比较它们是否重叠:

代码语言:javascript
复制
<?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); // TRUE
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69127712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档