PHP 构建循环到当前月份的日历
PHP Build calendar that loops through until current month
我有一个项目正在学习 PHP。我需要创建一个页面,在一行中显示一年的 link 和那一年的月份。然后它打破并进入下一年。继续这个直到当年停止在当年和当月。像这样:
2017 January February March April May June July August...
2018 January February March April May June July
每年和每个月都是 link 显示结果的另一个页面,有点像博客文章的存档,但在 WordPress 中不是。
我已经能够使用 while 循环遍历所有以前的年份,条件是它不是当前年份。我能够正确显示当前年份,但我不得不将其分成 2 组独立的代码,这些代码基本上具有相同的 HTML 代码 2 次。改变的是月份计算。我想将其构建到一组说明中,如果将来更改,我只需更改一次。 2次也不错,但可以精简。
我能够遍历并获取所有年份和所有月份(但我只想要一年中的当前月份),并且我能够仅通过当前月份(7 月)遍历所有年份每年显示(所有年份都缺少 8 月前)
有什么方法可以完成吗?从 IF
语句开始,然后转到我想要完整月份的 while 循环,以及我希望它停止的月份的 FOREACH
?
我知道我将需要使用 strtotime
和 mktime
方法,但是您在这里使用什么结构?
我已经为此工作了几个星期,我觉得自己像个白痴,因为我无法弄清楚一些看起来如此基础的东西。我的所有搜索结果都是人们询问有关日历、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 . '/'
我希望能够将它们合二为一。
谢谢!
我将忽略这样一个事实,即您的第一个循环在 td
元素上包含 class sp-month
,而您的第二个循环将其关闭。我不确定这种差异是否是有意的。您的第二个循环也不包括整个 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++;
}
我有一个项目正在学习 PHP。我需要创建一个页面,在一行中显示一年的 link 和那一年的月份。然后它打破并进入下一年。继续这个直到当年停止在当年和当月。像这样:
2017 January February March April May June July August...
2018 January February March April May June July
每年和每个月都是 link 显示结果的另一个页面,有点像博客文章的存档,但在 WordPress 中不是。
我已经能够使用 while 循环遍历所有以前的年份,条件是它不是当前年份。我能够正确显示当前年份,但我不得不将其分成 2 组独立的代码,这些代码基本上具有相同的 HTML 代码 2 次。改变的是月份计算。我想将其构建到一组说明中,如果将来更改,我只需更改一次。 2次也不错,但可以精简。
我能够遍历并获取所有年份和所有月份(但我只想要一年中的当前月份),并且我能够仅通过当前月份(7 月)遍历所有年份每年显示(所有年份都缺少 8 月前)
有什么方法可以完成吗?从 IF
语句开始,然后转到我想要完整月份的 while 循环,以及我希望它停止的月份的 FOREACH
?
我知道我将需要使用 strtotime
和 mktime
方法,但是您在这里使用什么结构?
我已经为此工作了几个星期,我觉得自己像个白痴,因为我无法弄清楚一些看起来如此基础的东西。我的所有搜索结果都是人们询问有关日历、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 . '/'
我希望能够将它们合二为一。
谢谢!
我将忽略这样一个事实,即您的第一个循环在 td
元素上包含 class sp-month
,而您的第二个循环将其关闭。我不确定这种差异是否是有意的。您的第二个循环也不包括整个 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++;
}