一直循环到当月的PHP构建日历

时间:2018-07-10 19:38:42

标签: php html strtotime mktime

我在学习PHP时正在研究一个项目。我需要创建一个页面,该页面在一行上显示一年和一年中的几个月的链接。然后它打破了,直到第二年。继续此操作,直到当年停止在当年和当月。像这样:

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

2018 January February March April May June July

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

我可以使用while循环浏览过去的所有年份,条件是它不是当前年份。我能够正确显示当前年份,但是我不得不将其分成两套基本相同的HTML代码两次。是几个月的计算发生了变化。我想将其构建为一组指令,如果将来进行更改,则只需更改一次即可。 2次还不错,但是可以简化。

我能够遍历并获得所有年份和所有月份(但我只想要到一年中的当前月份),并且能够遍历所有年份,并且只显示当前月份(7月)每年(所有年份都缺少8月)

有没有可以用来完成此操作的方法?从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 . '/'

我希望能够将它们分别放入一个。

谢谢!

1 个答案:

答案 0 :(得分:1)

我将忽略这样一个事实:您的第一个循环在sp-month元素上包含类td,而第二个循环则将其保留。我不确定这种区别是否是故意的。您的第二个循环也不包含整个rand(5, 100)部分。不知道它的目的是什么还是您是否想要它,但是我将其保留在第一个循环中。

因此,您要尝试做的主要事情是拥有它,以使在当年您不会打印出当月之后的任何月份。仅需一个外部循环即可轻松完成。您需要做的就是将while循环的条件从!=更改为<=(我们现在将当前年份包括在该循环中),然后更改条件for循环中的$x小于或等于12并且循环的年份不是当前年份,或者如果 ,则$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++;
}

DEMO