Как мне исправить последний месяц ошибок месяца, которые возникают в результате этого PHP-кода?

Код ниже – это то, что я использую для меню веб-сайта, которое перемещает ссылку на страницу текущего месяца вверху списка ссылок на изменение месяца.

Но это не удается 31-го числа месяцев, таких как апрель; Для большинства ссылок я получаю две ссылки на тот же месяц. Я прочитал проблемы с тем, как php генерирует даты, но не может понять, как изменить этот код.

Кто-нибудь из Php Ph.D хочет взять у него удар? благодаря

<?php $month1 = (date('F', mktime(date('H'), date('i'), date('s'), date('m')+1 , date('d'), date('Y')))); $month2 = (date('F', mktime(date('H'), date('i'), date('s'), date('m')+2 , date('d'), date('Y')))); $month3 = (date('F', mktime(date('H'), date('i'), date('s'), date('m')+3 , date('d'), date('Y')))); $month4 = (date('F', mktime(date('H'), date('i'), date('s'), date('m')+4 , date('d'), date('Y')))); $month5 = (date('F', mktime(date('H'), date('i'), date('s'), date('m')+5 , date('d'), date('Y')))); $month6 = (date('F', mktime(date('H'), date('i'), date('s'), date('m')+6 , date('d'), date('Y')))); $month7 = (date('F', mktime(date('H'), date('i'), date('s'), date('m')+7 , date('d'), date('Y')))); $month8 = (date('F', mktime(date('H'), date('i'), date('s'), date('m')+8 , date('d'), date('Y')))); $month9 = (date('F', mktime(date('H'), date('i'), date('s'), date('m')+9 , date('d'), date('Y')))); $month10 = (date('F', mktime(date('H'), date('i'), date('s'), date('m')+10 , date('d'), date('Y')))); $month11 = (date('F', mktime(date('H'), date('i'), date('s'), date('m')+11 , date('d'), date('Y')))); ?> <a href="http://mydomain.com/<?php echo strtolower(date('F')); ?>/" title="<?php echo ucfirst(date('F')); ?>"><?php echo (date('F')); ?></a><br /> <a href="http://mydomain.com/<?php echo strtolower($month1); ?>/" title="<?php echo $month1; ?>"><?php echo $month1; ?></a><br /> ...(2 through 10)... <a href="http://mydomain.com/<?php echo strtolower($month11); ?>/" title="<?php echo $month11; ?>"><?php echo $month11; ?></a><br /> 

Related of "Как мне исправить последний месяц ошибок месяца, которые возникают в результате этого PHP-кода?"

<?php

 $current_month = date('n'); $MONTHS = array(); for ($m=0; $m<12; $m++) { $display_month = $m + $current_month; $MONTHS[] = date('F',mktime(1,1,1,$display_month,1,date("Y"))); } foreach ($MONTHS as $month) { echo " <a href=\"http://mydomain.com/".strtolower($month)."\" title=\"$month\">$month</a><br />"; } ?> в $current_month = date('n'); $MONTHS = array(); for ($m=0; $m<12; $m++) { $display_month = $m + $current_month; $MONTHS[] = date('F',mktime(1,1,1,$display_month,1,date("Y"))); } foreach ($MONTHS as $month) { echo " <a href=\"http://mydomain.com/".strtolower($month)."\" title=\"$month\">$month</a><br />"; } ?> 

Вы можете посмотреть на использование strtotime () вместо mktime. Поскольку в strtotime () можно делать

 strtotime("-1 day", time()); 

1-го числа месяца, и он вернется в один прекрасный день точно. Даже подсчет в високосные годы.

Используйте 1 вместо даты ('d') в своем коде; однако, в любое время, когда вы видите дублированный код, где изменяется только число, вы должны думать о циклах:

 <?php for ($i = 0; $i < 12; $i++) { $month = date('F', mktime(0, 0, 0, date('m') + $i, 1, date('Y'))); ?> <a href="http://mydomain.com/<?php echo strtolower($month); ?>" title="<?php echo $month; ?>"><?php echo $month; ?></a><br /> <?php } ?> 

Я понятия не имею, решает ли это вашу проблему, поскольку я не совсем уверен, что я понял, в чем проблема, но у меня есть идея о том, как сделать код более понятным:

 <?php $month1 = date('F', strtotime("+1 month")); $month2 = date('F', strtotime("+2 month")); $month3 = date('F', strtotime("+3 month")); $month4 = date('F', strtotime("+4 month")); $month5 = date('F', strtotime("+5 month")); $month6 = date('F', strtotime("+6 month")); $month7 = date('F', strtotime("+7 month")); $month8 = date('F', strtotime("+8 month")); $month9 = date('F', strtotime("+9 month")); $month10 = date('F', strtotime("+10 month")); $month11 = date('F', strtotime("+11 month")); ?> 

(но я также согласен с записью Чада Берча об использовании циклов вместо повторения кода)

 <?php foreach(range(0,11) as $key){ $months[$key]=date('F', strtotime("+{$key} month")); } /* ... */ foreach($months as $month){ print "<a href='http://mydomain.com/".strtolower($month). "' title='".$month."'>".$month."</a><br />"; } ?> 

О, дорогой, это какой-то уродливый код. Вы должны действительно посмотреть на циклы (для / while / etc) и массивы .

Код, который у вас там, может быть сведен к следующему:

Отредактировано : у моего кода была та же проблема, что и у оригинала, исправлена ​​с помощью решения scronide, спасибо за указание на это.

 <?php for ($i = 0; $i < 12; $i++) { $months[$i] = date('F', mktime(0, 0, 0, date('m') + $i, 1, date('Y'))); } for ($i = 0; $i < 12; $i++) { print '<a href="http://mydomain.com/'.strtolower($months[$i]).'/" title="'.$months[$i].'">'.$months[$i]."</a><br />\n"; } ?> 

Или если вы не возражаете объединять две функции (получать имена месяцев и печатать ссылки) вместе, и вам не нужны имена месяцев, хранящиеся для чего-либо еще:

 <?php for ($i = 0; $i < 12; $i++) { $month = date('F', mktime(0, 0, 0, date('m') + $i, 1, date('Y'))); print '<a href="http://mydomain.com/'.strtolower($month)."/\" title=\"$month\">$month</a><br />\n"; } ?>