Календарь PHP Build, который проходит до текущего месяца
У меня есть проект, над которым я работаю во время изучения 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
заявление и перейти к циклу, где я хочу полных месяцев, и 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 . '/'
Я хочу иметь возможность объединить их в одну.
Спасибо!
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++;
}