如何在 PHP 中调整菜单订购系统的周和年
How to adjust week and year for a menu ordering system in PHP
我正在更新一家餐厅的网站,您可以在该网站上订购每日菜单,而且菜单每周都会更改。系统只按周存储菜单,不指定年份。它有一个错误,现在(2015 年第 53 周)如果管理员想进入第一周菜单,它会被解释为 2015 年的第一周。
我想改变这一点,让他们进入明年的 +-10 周,并在 1 月份回顾旧一年。
到目前为止,我的代码看起来像这样,但我确定它不会像三月那样给出正确的年份:
$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 年。在 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
我正在更新一家餐厅的网站,您可以在该网站上订购每日菜单,而且菜单每周都会更改。系统只按周存储菜单,不指定年份。它有一个错误,现在(2015 年第 53 周)如果管理员想进入第一周菜单,它会被解释为 2015 年的第一周。 我想改变这一点,让他们进入明年的 +-10 周,并在 1 月份回顾旧一年。 到目前为止,我的代码看起来像这样,但我确定它不会像三月那样给出正确的年份:
$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 年。在 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