区间重合算法:多个时间段重合判断

Talk is cheap, show you the code

<?php

/**
 * 时间段重合判断
 * @param array $data 日期数组
 * @param string $fieldStart 开始日期字段名
 * @param string $fieldEnd 结束日期字段名
 * @return bool true为重合,false为不重合
 */
function is_time_cross(array $data, string $fieldStart = 'start_day', string $fieldEnd = 'end_day')
{
    // 按开始日期排序
    array_multisort(
        array_column($data, $fieldStart),
        SORT_ASC,
        $data
    );

    // 冒泡判断是否满足时间段重合的条件
    $num = count($data);
    for ($i = 1; $i < $num; $i++) {
        $pre = $data[$i-1];
        $current = $data[$i];
        if (strtotime($pre[$fieldStart]) <= strtotime($current[$fieldEnd]) && strtotime($current[$fieldStart]) <= strtotime($pre[$fieldEnd])) {
            return true;
        }
    }

    return false;
}

// 测试例子
$data = [
    ['start_day' => '2019-01-01', 'end_day' => '2019-01-31'],
    ['start_day' => '2018-01-01', 'end_day' => '2018-01-31'],
    ['start_day' => '2019-03-01', 'end_day' => '2019-05-31'],
    ['start_day' => '2019-10-01', 'end_day' => '2019-10-31'],
    ['start_day' => '2019-04-01', 'end_day' => '2019-04-10'],
];
var_dump(is_time_cross($data));
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一.项目使用第三方: 没用过第三方学习: 1.RMQClient 参考链接: http://www.rabbitm...
    玉思盈蝶阅读 288评论 0 0
  • 第一场 又是一个星期一,凌晨揉了揉惺忪的眼睛,伸手摸出手机一看,六点钟。就像一盆冷水倒...
    红巧儿阅读 357评论 2 5
  • 对于温言,我从来不知该从何说起,那种温暖,太干净,太醇厚,太撕心裂肺。从来没想着要给这部作品写些什么,因为,它太珍...
    茶竹药星阅读 258评论 0 2