Пересечение временных интервалов

211
10 января 2018, 19:30

Есть массив времени:

$arTimes[0]["START"] = 1515486600 //09.01.2018 11:30
$arTimes[0]["END"] = 1515488400   //09.01.2018 12:00
$arTimes[1]["START"] = 1515488400 //09.01.2018 12:00
$arTimes[1]["END"] = 1515488400   //09.01.2018 12:30
$arTimes[2]["START"] = 1515486600 //09.01.2018 11:30
$arTimes[2]["END"] = 1515490200   //09.01.2018 12:30

В данном контексте $arTimes[0] не пересекается с $arTimes[1] но пересекается с $arTimes[2], и $arTimes[1] пересекается с $arTimes[2].

Необходимо узнать все пересечения рекурсивно, то есть если $arTimes[0] пересекся с $arTimes[2], то далее нужно узнать с кем пересекается $arTimes[2] и т.д.

Цель, если есть пересечения у элемента $arTimes[0] то установить $arTimes[0]["NEW_START"] = наименьший START и $arTimes[0]["NEW_END"] наибольший END из всех элементов которые пересеклись друг с другом.

Так же, прикрепить эти элементы к $arTimes[0]["ELEM"][] = $arTimes[2] и т.д., затем удалить их из массива $arTimes, что бы более не сравнивать интервалы.

Как же это реализовать?

Answer 1

Во-первых ошибка в исходных данных: $arTimes[1]["END"] = 1515488400 //09.01.2018 12:30 это не 12:30

Должно быть так:

$arTimes[0]["START"] = 1515486600; //09.01.2018 11:30
$arTimes[0]["END"] = 1515488400 ;  //09.01.2018 12:00
$arTimes[1]["START"] = 1515488400; //09.01.2018 12:00
$arTimes[1]["END"] = 1515490200;   //09.01.2018 12:30
$arTimes[2]["START"] = 1515486600; //09.01.2018 11:30
$arTimes[2]["END"] = 1515490200;   //09.01.2018 12:30

Потом в рекурсии сравниваем интервалы времени:

function chain($index) {
    global $arTimes, $freezeIndex;
    $time = $arTimes[$index];
    if(!isset($time)) {
        return;
    }
    foreach($arTimes AS $indexTime => $value) {
        if(!in_array($indexTime, $freezeIndex) && $indexTime != $index && max($value["START"], $time["START"]) < min($value["END"], $time["END"])) {
            $freezeIndex[] = $indexTime;
            if($time["START"] > $value["START"]) {
                $arTimes[0]["NEW_START"] = $value["START"];
            }
            if($time["END"] < $value["END"]) {
                $arTimes[0]["NEW_END"] = $value["END"];
            }
            echo "Пересекаются " . $index . " и " . $indexTime . "\n";
            chain($indexTime);
        }
    }
}

Ну и посмотреть: https://ideone.com/W8DESm

READ ALSO
Проверка isset($_FILES[filename]) не работает

Проверка isset($_FILES[filename]) не работает

ЗдравствуйтеВ форме есть поле <input type="file" name="filename" /> При отправке формы идёт проверка

235
JS отдача файла клиенту

JS отдача файла клиенту

Есть вопросСуть - на сервере Symfony, контроллер генерирует

180
Подключение к сайту по сокетам

Подключение к сайту по сокетам

Пытаюсь разобраться с websocket'ами на phpЕсть веб хостинг (сайт), нужно подключиться к нему по сокетам

189
Не работает сайт на modx Access denied [требует правки]

Не работает сайт на modx Access denied [требует правки]

Перестал работать сайт на modxНе переходит ни в админку ни сам сайт не работает

210