цикл foreach не проходит мимо начала диапазона - PullRequest
0 голосов
/ 25 июня 2018

Я пытаюсь построить цикл, который повторяется каждый месяц года до текущего месяца. Мой цикл foreach просто остается на старте и не проходит через остальную часть диапазона. Вот мой код:

$startMonth = '01';
$endMonth = date('m');

foreach (range($startMonth, $endMonth) as $month) {
    $dataValue = date('n', $month);
    echo '<td class="month" data-value="';
    echo $dataValue;
    echo '" data-id="' . $incrementYear . '"><a href="/Archive/view/';
    echo $incrementYear;
    echo '/';
    echo date('m', $month);
    echo '">';
    echo date('F', $month);
    echo '</a></td>';
}

Вот вывод:

January    January    January    January    January    January

Каждый месяц имеет правильную ссылку на то, что должен иметь январь, но по какой-то причине диапазон никогда не оставляет «01», то есть $startMonth, и я не уверен, почему. Я думал, что это как-то связано с целым числом против строки, но удалив ' из $startMonth = '01';, чтобы сделать его целым числом, но это тоже не сработало.

Насколько я понимаю, я правильно использую диапазон.

Что мне здесь не хватает?

EDIT

  • $ dataValue можно закомментировать, и я все равно получу January 6 раз, просто ссылка будет иметь значение данных, отличное от того, что я хочу. Эта переменная не влияет на сам месяц.

  • Если я изменю нижнюю строку кода с echo date('F', $month); на echo $month;, я получу:

    1    2    3    4    5    6
    

Ответы [ 4 ]

0 голосов
/ 25 июня 2018

Попробуйте ниже код:

$start_date = date('Y-01-01');
$end_date = date('Y-m-01');

$loop_date = $start_date;

//loop through months
while(strtotime($loop_date)<=strtotime($end_date)){

echo date('F',strtotime($loop_date));

$loop_date = date('Y-m-d', strtotime("+1 months", strtotime($loop_date)));

}
0 голосов
/ 25 июня 2018

Попробуйте это:

$startMonth = '01';
$endMonth = date('m');

foreach (range($startMonth, $endMonth) as $month) { 
 $dataValue = date('F', mktime(0, 0, 0, $month, 1, date('Y')));
 $month = sprintf('%02d', $month);
 echo '<td class="month" data-value="' . $dataValue . '" data-id="' . $month . '"><a href="/Archive/view/' . $month . '">' . $dataValue . '</a></td>';
}

Выход:

JanuaryFebruaryMarchAprilMayJune
0 голосов
/ 25 июня 2018

Проблема в том, что в date() в качестве метки времени вы всегда передаете 01, 02 ... и это преобразуется в ~ 12 первых секунд метки времени Unix.Таким образом, 1970-01-01 00:00:03 - это January.

. Измените код для использования mktime

$dataValue = date('n', mktime(0, 0, 0, $month, 1, date('Y')));

$startMonth = '01';
$endMonth = date('m');

foreach (range($startMonth, $endMonth) as $month) {
    $time = mktime(0, 0, 0, $month, 1, date('Y'));
    $date = date('n', $time);
    $month = date('m', $time);
    $monthName = date('F', $time);

    echo "<td class='month' data-value='{$date}' data-id='{$incrementYear}'><a href='/Archive/view/{$incrementYear}/{$month}'>{$monthName}</a></td>";
}
0 голосов
/ 25 июня 2018

Измените $ dataValue с

$dataValue = date('n', $month);

до

$dateObj   = DateTime::createFromFormat('!m', $month);
echo $dateObj->format('F');

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...