Как исправить ошибки последнего дня месяца, возникающие в результате использования этого 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 />

person markratledge    schedule 17.04.2009    source источник
comment
Разве вы не смотрите на это и не спрашиваете себя, должен ли быть лучший способ сделать это...? Циклы и массивы, добрый сэр, циклы и массивы.   -  person Paolo Bergantino    schedule 18.04.2009
comment
Я подумал, что есть лучший способ, но я останусь с одним вопросом за раз. Я все еще изучаю php и в основном знаю довольно статический код для веб-страниц....   -  person markratledge    schedule 18.04.2009


Ответы (5)


<?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 />";
}
?>

person Eddy    schedule 17.04.2009
comment
Это прекрасно работает; другие ответы по-прежнему терпят неудачу 31-го числа месяца. Спасибо, Марк - person markratledge; 18.04.2009

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

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

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

person Ólafur Waage    schedule 17.04.2009

Используйте 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
}
?>
person scronide    schedule 17.04.2009

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

<?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 />";
    }
?>
person elzapp    schedule 17.04.2009

О боже, это какой-то уродливый код. Вы действительно должны изучить Циклы (for/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";
}
?>
person Chad Birch    schedule 17.04.2009
comment
Это также сохраняет проблему исходного кода: +$i month не будет работать для дат, которые не существуют в следующем месяце. - person scronide; 18.04.2009
comment
Ах, вы правы, если это 31 марта или что-то в этом роде, он сломается. Отредактирую, спасибо. - person Chad Birch; 18.04.2009
comment
Да, это уродливый код. Но я решил, что буду задавать по одному вопросу за раз, и, может быть, кто-нибудь покажет мне лучший способ... Спасибо за все ответы - Марк - person markratledge; 18.04.2009