Это, конечно, не будет самым быстрым или самым умным ответом, но будет приятно прочитать код.
Если предположить, что мы осуществляем доставку в зону A:
$dates = array(
new DateTime('next monday'), // magic!
new DateTime('next wednesday'),
new DateTime('next friday'),
);
// Seems to work because since PHP 5.2.2 DateTime objects
// can be compared with the < and > operators
$shippingDate = min($dates);
echo $shippingDate->format('Y-m-d');
Возможно, вы захотите взглянуть на форматы относительной даты , доступные в PHP, это та часть, где происходит волшебство «следующего понедельника».Для получения информации о том, что вы можете сделать с $shippingDate
, см. Документацию по классу DateTime
.
Обновление
Для полноты, вот более старая школаверсия, которая не требует PHP 5.3 и также должна быть быстрее (хотя скорость здесь практически не имеет значения).Мне это не очень нравится, потому что нелегко убедиться, что он работает правильно.В отличие от версии выше, у этой была ошибка, когда я впервые ее написал.Простое это хорошо.
$today = date('w');
// These values are from http://www.php.net/manual/en/function.date.php
$shippingDays = array(
1, // mon
3, // wed
5, // fri
);
// Each of these weekdays is how many days into the future?
foreach($shippingDays as &$day) {
$day = (7 + $day - $today) % 7;
}
// Get the earliest one, but not if it's today
// array_filter is used to remove a possible 0
$daysInFuture = min(array_filter($shippingDays));
$shippingDate = new DateTime('+'.$daysInFuture.' days');
echo $shippingDate->format('Y-m-d');
См. Это в действии .