Где теряется первая дата?

drkrol

Постоялец
Регистрация
6 Мар 2016
Сообщения
112
Реакции
11
Здравствуйте. Есть вот такой скрипт:
PHP:
$diaposons = array_map(
    function($e) { return array('datestart' => strtotime($e->datestart), 'dateend' => strtotime($e->dateend)); },
    json_decode('[{"datestart":"2016-12-12","dateend":"2016-12-18"},{"datestart":"2016-12-11","dateend":"2016-12-14"},{"datestart":"2016-12-16","dateend":"2016-12-19"},{"datestart":"2016-12-12","dateend":"2016-12-12"},{"datestart":"2016-12-14","dateend":"2016-12-16"}]')
);
usort($diaposons, function($a, $b) { return $a['datestart'] - $b['datestart']; });
$result = [];
$left = $diaposons[0]['datestart'];
$right = $diaposons[0]['dateend'];
$num = count($diaposons);
$day = 24 * 60 * 60;
for ($i = 3; $i < $num; ++$i) {
    if ($diaposons[$i]['datestart'] > $right) {
        $right = $diaposons[$i]['dateend'];
        continue;
    }
    $end = min($right, $diaposons[$i]['dateend']);
    $result[] = array(
        'start' => max($left + $day, $diaposons[$i]['datestart']),
        'end' => $end
    );
    $left = $end;
    $right = max($right, $diaposons[$i]['dateend']);
}
foreach ($result as $r) {
    for ($i = $r['start']; $i <= $r['end']; $i += $day) {
        echo date('Y-m-d', $i), PHP_EOL;
    }
}

Где json_decode('[{"datestart":"2016-12-12","dateend":"2016-12-1.... - данные из моей базы данных. Вот фидл : Для просмотра ссылки Войди или Зарегистрируйся структуры
datestart - дата заезда
dateend - дата выезда

Этот скрипт нужен для бронирования номеров в гостинице. Чтобы избежать повторяющейся брони на одни и те же даты, нужно знать, на какие даты уже номера забронированы. То есть, чтобы 2 разных человека не забронировали на одни и те же даты один и тот же номер. Когда я узнаю уже занятые даты, я могу запретить бронь на эти даты.
В бд есть только первая и последняя дата, а, по факту, человек будет жить все дни. То есть, если дата заезда 11 числа, а дата выезда 14, то жить он будет 11,12,13 и 14 числа (что я и попытался визуализировать)

Цель скрипта - найти только те даты, которые повторяются 3 раза. Для наглядности сделал картинку:
a2c40b74090045ab9baef8ae0048c1a2.jpg



На картинке вы видите, что повторяются 3 раза только 3 даты: 2016-12-12, 2016-12-14 и 2016-12-16.
Я эти данные и пытаюсь получить, но скрипт работает не верно. Он возвращает, почему-то, только 2 даты из трёх: 2016-12-14 и 2016-12-16.
2016-12-12 он где-то теряет.

Подскажите, где ошибка? Где теряется первое повторение?
 
Тут явно не просто в потере одного значения дело. Сам алгоритм подсчёта кривой.

К примеру если первый интервал сделать не с 12го, а с 11го, то выдаётся сразу 5 значений, с 14го по 18е включительно.

К сожалению довольно запутанное решение, времени нет сейчас подробно разбираться...в общем надо проверять и перепроверять основной алгоритм в for'е


P.S. В общем всё-таки решил разобраться в задачке))
Вот так вроде работает (тот случай, когда легче заново написать, чем искать баг) :
PHP:
for ($i=$diaposons[0]['datestart'];$i<=$diaposons[$num-1]['dateend'];$i+=$day) {
   $n=0;
   foreach ($diaposons as $d) {
     if (  $i>=$d['datestart']  AND $i<=$d['dateend'])
         $n++;
   }
   if ($n>2)
     echo date('Y-m-d', $i).'<br>';
}
 
Последнее редактирование:
Назад
Сверху