Рассчитать встречи между двумя датами - PullRequest
0 голосов
/ 25 апреля 2019

Ситуация:

У меня есть массивы с информацией об использованных встречах и рассчитанных днях для новой серии встреч на основе PHP.

Например, существующий массив встреч:

Array
(
    [0] => Array
        (
            [date] => 2019-05-02
            [time_start] => 14:00:00
            [time_end] => 15:30:00
        )
    [1] => Array
        (
            [date] => 2019-05-06
            [time_start] => 14:00:00
            [time_end] => 15:30:00
        )
)

Теперь я проверю, есть ли у вычисленных рядов (в том же формате массива) коллизии с существующими встречами.

Мой вопрос: Как я могу проверить, существует ли коллизия между временем начала и окончания иЕсли да, как я могу дать массиву новое значение с временными окнами после или до существующей встречи.Это в промежутках времени с 08:00 до 16:00.

То, что у меня есть, - это расчет дней встречи.

 private function calculate_dates($data, $measure)
{

    $this->load->model('calendar/calendar_model');
    $holiday_dates = $this->calendar_model->get_holidays();

    foreach ($holiday_dates as $key => $value) {
        $holidays[] = $value['holiday_date'];
    }

    $begin = new DateTime($data->measure_begin);
    $end = new DateTime($data->measure_end);
    $oneday = new DateInterval("P1D");
    $days = json_decode($data->measure_dates);
    $wdays = array();
    $ue_minutes = 0;

    $minutes = ($data->measure_ue * $measure->ue_minutes/2);
    $daterange = new DatePeriod( $begin, DateInterval::createFromDateString('+1 weekdays') ,$end );

    foreach(new DatePeriod($begin, $oneday, $end->add($oneday)) as $day) {
        $day_num = $day->format("N"); /* 'N' number days 1 (mon) to 7 (sun) */
        if($day_num < 6 ) { /* weekday */
            $wdays[] = $day;
        }
    }

    $count = 1;
    foreach($wdays as $date){
        foreach ($days as $key => $value) {
            if(mb_strtolower($date->format('l')) == $value){

                if(($data->measure_ue/2)+1 != $count){
                    if(in_array($date->format('Y-m-d'), $holidays)) {
                        $dates[] = $this->close_days($date, $days, true)->format('l, d.m.Y');
                    } else {
                        $dates[] = $date->format('l, d.m.Y');
                    }
                    $count++;
                }
            }
        }
    }

    return array(
        'dates' => $dates,
        'minutes' => round($minutes/count($dates))
    );
}

private function close_days($date, $days, $init = false)
{
    if($init){
        $days[] = 'saturday';
        $days[] = 'sunday';
    }

    if( in_array(mb_strtolower($date->format('l')), $days) ) {
        $this->close_days($date->modify('next day'), $days);
    }
    return $date;
}

Любые идеи для решения или, может быть,код для лучшего способа?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...