Я обновляю сайт ресторана, где вы можете заказать ежедневное меню, а меню меняется еженедельно. Система сохраняет меню только по неделям, без указания года. В ней была ошибка, которая теперь (53-я неделя 2015 года), если администратор хотел войти в меню 1-й недели, интерпретировалась как 1-я неделя 2015 года.
Я хочу изменить это, чтобы позволить им ввести + -10 недель в следующем году и вернуться к старому году в январе.
Пока мой код выглядит следующим образом, но я уверен, что он не даст правильного года после марта:
$year = date("Y");
$current_week = date("W");
$w_diff = abs($current_week - $week_number);
// If there is a year change (lower or higher current week and edit week) and it is within 10 weeks, we edit the other year, otherwise current year
// This code is imperfect, need to check mid year as it does not work
if ($current_week > $week_number && $w_diff >= 10) {$year++;}
elseif ($current_week < $week_number && $w_diff >= 10) {$year--;}
$ week_number количество недель, которое администратор хочет редактировать в меню. То, что я хочу: если администратор хочет изменить 9-ю неделю сейчас, он должен отредактировать 2016 год, но если он хочет увидеть 40-ую неделю, он должен показать 2015. В 1-ю неделю 2016 года, на 52-й неделе, он должен показать 2015, но для 10 неделя это должно показать 2015.
Что я могу изменить в этом коде, чтобы добиться этого?
Вы можете сделать что-то вроде этого, используя оператор по модулю (%):
function get_year($current_year, $current_week, $week_number, $max_forward) {
$forward = (53 + $week_number - $current_week) % 53 <= $max_forward;
if ($forward == $week_number < $current_week) {
$year += $forward ? 1 : -1;
}
return $year;
}
Четвертый аргумент устанавливает правило, когда неделя считается будущей. Таким образом, вы пропустили бы 10, чтобы указать, что можете смотреть на 10 недель вперед, но любое дальнейшее будет фактически интерпретироваться как оглядывание назад.
Чтобы проверить вышеуказанную функцию, вы можете сделать что-то вроде этого:
// test
echo "curr \tweek \tyear<br>";
for ($current_week = 1; $current_week < 52; $current_week += 10) {
for ($week_number = 1; $week_number < 52; $week_number += 10) {
$year = get_year(2015, $current_week, $week_number, 10);
echo "$current_week \t$week_number \t$year<br>";
}
}
Выход:
curr week year
1 1 2015
1 11 2015
1 21 2014
1 31 2014
1 41 2014
1 51 2014
11 1 2015
11 11 2015
11 21 2015
11 31 2014
11 41 2014
11 51 2014
21 1 2015
21 11 2015
21 21 2015
21 31 2015
21 41 2014
21 51 2014
31 1 2015
31 11 2015
31 21 2015
31 31 2015
31 41 2015
31 51 2014
41 1 2015
41 11 2015
41 21 2015
41 31 2015
41 41 2015
41 51 2015
51 1 2016
51 11 2015
51 21 2015
51 31 2015
51 41 2015
51 51 2015
Других решений пока нет …