Добавьте два рабочих дня в массив даты, исключая даты отпуска

Я пытаюсь добавить 2 дня к дате, но также хочу исключить дни в массиве.

массив дат для исключения:

$bankHolidays = array();
foreach($obj as $e) {
    if($e->division == 'england-and-wales') {
        foreach($e->events as $events) {
            $bankHolidays[] = $events->date;
        }
    }
}

Добавление 2 рабочих дней на сегодняшний день

$ret = date('d-m-Y', strtotime($bill["charge_customer_at"]. ' +2 weekdays'));

Как включить массив дат для исключения?

В качестве примера, если моя дата была 2017-07-19, и я хочу добавить 2 недели, это приведет к выводу 2017-07-21.

Но если 2017-07-21 был в моем массиве, он должен пропустить эту дату и продолжить добавление 2-х рабочих дней, поэтому результат будет 2017-07-24 из-за выходных.

Ответ 1

Вы можете сделать что-то так же просто, как использовать цикл while.

$date = '2017-07-25';
$reserved = ['2017-07-27', '2017-07-28'];
$days = 2;

while ($days > 0) {
    $date = date('Y-m-d', strtotime($date . ' +1 weekday'));
    if (! in_array($date, $reserved)) $days--;
}

var_dump($date);

Ответ 2

Найти следующую функцию рабочего дня с заданным смещением.

Следующее в основном принимает вашу заданную дату, количество дней, которые вы хотите пропустить, в вашем случае 2 и массив праздников, который вы препопыляете, как вы показываете в своем вопросе. Если в будний день, когда так много после вашей даты праздника, он добавляет день и снова проверяет.

function nextBusinessDay($date, $daysToSkip,$holidays){
    $day = date('Y-m-d',strtotime($date. ' + '.$daysToSkip.' weekday'));
    if(!in_array($day,$holidays)){
         return $day;
    } else {
        return nextBusinessDay(date('Y-m-d',strtotime($date.' +1 day')), $daysToSkip,$holidays);
    }
}

$date = '2017-07-19';
$holidays = ['2017-07-21'];
echo nextBusinessDay($date,2,$holidays);//returns 2017-07-24

$date = '2017-07-19';
$holidays = ['2017-07-21', '2017-07-24'];
echo nextBusinessDay($date,2,$holidays);//returns 2017-07-25 like if it were a 4 day weekend

Извините, мне потребовалось некоторое время, чтобы получить шанс просмотреть его и опубликовать что-нибудь. Это должно сработать для вас. Я понимаю, что вам нужно вернуть первую деловую дату, которая составляет два дня с определенной даты, а не добавлять два недели до тех пор, пока дата не будет в вашем календаре. Если вы действительно хотите добавить 2 дня или сколько угодно дней, измените

return nextBusinessDay(date('Y-m-d',strtotime($date.' +1 day')), $daysToSkip,$holidays);

to

return nextBusinessDay(date('Y-m-d',strtotime($date.' +'.$daysToSkip.' day')), $daysToSkip,$holidays);