如何在 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