【问题标题】:PHP check if dates overlap in arrayPHP检查日期是否在数组中重叠
【发布时间】:2019-10-08 15:05:08
【问题描述】:

我想检查数组中的任何日期是否会与其他日期重叠。 我只想知道它是真是假。 它必须检查开始和停止时间是否会与其他行中的时间重叠。

这是我的数组的一个示例。 在这种情况下,它应该返回 false。

$testFalse = [
    'row_0' => [
        'startTime' => '2019-10-07 07:30:00',
        'stopTime' => '2019-10-07 09:00:00'   
    ],
    'row_1' => [
        'startTime' => '2019-10-07 07:30:00',
        'stopTime' => '2019-10-07 08:00:00'   
    ],
     'row_2' => [
        'startTime' => '2019-10-07 08:30:00',
        'stopTime' => '2019-10-07 10:00:00'   
    ],
];   

在这种情况下,它应该返回 true。

$testTrue = [
    'row_0' => [
        'startTime' => '2019-10-07 07:30:00',
        'stopTime' => '2019-10-07 09:00:00'   
    ],
    'row_1' => [
        'startTime' => '2019-10-07 09:00:00',
        'stopTime' => '2019-10-07 10:00:00'   
    ],
];     

我目前的尝试是,但我不想以某种方式将其组合成一个循环:

//------------StartTime row-0--------------------
if (($array['row_0']['startTime'] >= $array['row_1']['startTime']) && ($array['row_0']['startTime'] <= $array['row_1']['stopTime'])){
    var_dump('Is between');
}else{
    var_dump('Not between');
}
if (($array['row_0']['startTime'] >= $array['row_2']['startTime']) && ($array['row_0']['startTime'] <= $array['row_2']['stopTime'])){
    var_dump('Is between');
}else{
    var_dump('Not between');
}
?>

【问题讨论】:

标签: php for-loop


【解决方案1】:

您可以只检查其中一个日期是否介于:

$testTrue = [
    'row_0' => [
        'startTime' => '2019-10-07 07:30:00',
        'stopTime' => '2019-10-07 09:00:00'   
    ],
    'row_1' => [
        'startTime' => '2019-10-07 09:00:00',
        'stopTime' => '2019-10-07 10:00:00'   
    ],
];     

$testFalse = [
    'row_0' => [
        'startTime' => '2019-10-07 07:30:00',
        'stopTime' => '2019-10-07 09:00:00'   
    ],
    'row_1' => [
        'startTime' => '2019-10-07 07:30:00',
        'stopTime' => '2019-10-07 08:00:00'   
    ],
     'row_2' => [
        'startTime' => '2019-10-07 08:30:00',
        'stopTime' => '2019-10-07 10:00:00'   
    ],
];   

function checkIntersections(array $arr): bool {
    $count = count($arr);
    for($i=0;$i < $count;$i++) {
        $startDate = new DateTime($arr['row_'.$i]['startTime']);
        $stopDate = new DateTime($arr['row_'.$i]['stopTime']);

        for($j=0;$j < $count;$j++) {
            if ($j === $i) continue;
            $startDateCompare = new DateTime($arr['row_'.$j]['startTime']);
            $stopDateCompare = new DateTime($arr['row_'.$j]['stopTime']);

            if (
                ($startDate > $startDateCompare && $startDate < $stopDateCompare)
                || ($stopDate > $startDateCompare && $stopDate < $stopDateCompare)
            ) {
                return false;    
            }
        }

        return true;

    }
}

var_dump(checkIntersections($testTrue));
var_dump(checkIntersections($testFalse));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    • 2013-09-27
    • 2017-11-04
    • 1970-01-01
    • 2013-06-08
    相关资源
    最近更新 更多