PHP проверяет, перекрываются ли даты в массиве - PullRequest
0 голосов
/ 08 октября 2019

Я хочу проверить, не перекрывает ли одна из дат в массиве другие. Единственное, что я хочу знать, это правда или ложь. Он должен проверить, будет ли время начала и окончания перекрывать время в других строках.

Это пример моих массивов. В этом случае он должен вернуть 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');
}
?>

1 Ответ

1 голос
/ 09 октября 2019

Вы можете просто проверить, находится ли одна из дат между:

$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));
...