-3

我在学习 PHP 时正在做一个项目。我需要创建一个页面,在一行上显示一年和那一年的月份的链接。然后它打破并进入下一年。继续这个直到当前年份停止在当前年份和当前月份。像这样的东西:

2017 January February March April May June July August...

2018 January February March April May June July

每年和每月都是指向另一个页面的链接,该页面将显示结果,有点像博客文章的存档,但不是在 WordPress 中。

我已经能够使用 while 循环遍历所有以前的年份,条件是它不是当前年份。我能够正确显示当前年份,但我不得不将其拆分为 2 组独立的代码,这些代码基本上具有相同的 HTML 代码 2 次。改变的是月份计算。我想把它构建成一组指令,如果将来改变,我只需要改变一次。2次还不错,但可以精简。

我能够遍历并获取所有年份和所有月份(但我只想要一年中的当前月份),并且我能够遍历所有年份,并且每年只显示当前月份(七月)(八月前锋多年来都不见了)

有没有可以用来完成此任务的方法?从一个IF语句开始,然后转到我想要整个月份的 while 循环,以及FOREACH我希望它停止的月份?

我知道我将需要使用strtotimemktime方法,但你会在这里使用什么结构?

我已经为此工作了几个星期,我觉得自己像个白痴,因为无法弄清楚一些看似如此基本的东西。我所有的搜索都导致人们询问日历、mktime、strtotime 等,而我的答案似乎不适合我来解决这个问题。

这是我拥有的代码,但我想对其进行一些清理:

//Set year and month variables
$startYear = '2014';
$endYear = date('Y');
$incrementYear = $startYear;
$startMonth = '01';
$endMonth = date('m');
$dataValue = $startMonth;

// Start by laying out all previous years
while ($incrementYear != $endYear) {
    echo '<tr><td><a href="/Archive/view/' . $incrementYear . '">' . $incrementYear . '</a></td>';
    for ($x = 1; $x <= 12; $x++) {
        $dataValue = $x;
        echo '<td class="month sp-month" data-value="' . $dataValue . '" data-id="' . $incrementYear . '"><a href="/Archive/view/' . $incrementYear . '/' . date('m', mktime(0, 0, 0, $x, 1)) . '">' . date('F', mktime(0, 0, 0, $x, 1)) . ' (' . rand(5, 100) .'</a></td>';
    }
    $incrementYear++;
}

//Create the current year's line, incrementing only until the current month
if ($incrementYear == $endYear) {
    echo '<tr><td><a href="/Archive/view/' . $incrementYear . '">' . $incrementYear . '</a></td>';
    foreach (range($startMonth, $endMonth) as $month) {

        // Set format for output
        $time = mktime(0, 0, 0, $month, 1, date('Y'));
        $dataValue = date('n', $time);
        $monthNum = date('m', $time);
        $monthName = date('F', $time);

        echo '<td class="month" data-value="' . $dataValue . '" data-id="' . $incrementYear . '"><a href="/Archive/view/' . $incrementYear . '/' . $monthNum . '">' . $monthName . '</a></td>';
    }
}

输出:

2014 January Febuary March April May June July August September October November December 2015 January Febuary March April May June July August September October November December 2016 January Febuary March April May June July August September October November December 2017 January Febuary March April May June July August September October November December 2018 January Febuary March April May June July

这就是我想要的,但代码是我想要清理的。而不是拥有 2 套

echo '<tr><td><a href="/Archive/view/' . $incrementYear . '">' . $incrementYear . '</a></td>';

echo '<td class="month" data-value="' . $dataValue . '" data-id="' . $incrementYear . '"><a href="/Archive/view/' . $incrementYear . '/'

我希望能够将它们合二为一。

谢谢!

4

1 回答 1

1

我将忽略这样一个事实,即您的第一个循环包含元素sp-month上的类,td而您的第二个循环将其关闭。我不确定这种差异是否是故意的。您的第二个循环也不包括整个rand(5, 100)部分。不知道这样做的目的是什么,或者你是否想要它,但我会像在第一个循环中那样离开它。

因此,您要做的主要事情是拥有它,以便在当前年份您不会打印出当前月份之后的任何月份。只需一个外循环即可轻松完成。您需要做的就是将while循环的条件从!=to更改为<=(我们现在将在此循环中包含当前年份),然后将for循环的条件更改为只要$x小于或等于 12即可运行AND 循环的年份不是当前年份,或者,如果当前年份,则$x必须小于或等于$endMonth

while ($incrementYear <= $endYear) {
    echo '<tr><td><a href="/Archive/view/' . $incrementYear . '">' . $incrementYear . '</a></td>';
    for ($x = 1; $x <= 12 && ($incrementYear != $endYear || $x <= $endMonth); $x++) {
        $dataValue = $x;
        echo '<td class="month sp-month" data-value="' . $dataValue . '" data-id="' . $incrementYear . '"><a href="/Archive/view/' . $incrementYear . '/' . date('m', mktime(0, 0, 0, $x, 1)) . '">' . date('F', mktime(0, 0, 0, $x, 1)) . ' (' . rand(5, 100) .'</a></td>';
    }
    $incrementYear++;
}

演示

于 2018-07-11T12:51:47.653 回答