Como eu iria resolver o último dia dos erros mês esse resultado com este código php?
Pergunta
O código abaixo é o que eu estou usando para um menu website que move o link para a página do mês atual para o topo da lista de links sobre a mudança do mês.
Mas isso falhar no dia 31 de alguns meses, como a abril; Recebo dois links para o mesmo mês para a maioria dos links. Eu li através dos problemas com a forma como php gera datas, mas não consigo descobrir como alterar este código.
quer que ninguém php de Ph.D para dar uma facada nele? Graças
<?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 />
Solução
<?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 />";
}
?>
Outras dicas
Você pode olhar em usar strtotime () vez de mktime . Uma vez que em strtotime () para pode fazer
strtotime("-1 day", time());
No dia 1º de alguns meses e ele vai voltar um dia exatamente. Mesmo contando em anos bissextos.
Use 1 em vez de data ( 'd') em seu código; no entanto, a qualquer momento você vê código duplicado, onde apenas um número mudanças, você deve estar pensando sobre loops:
<?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
}
?>
Eu não tenho idéia se isso resolve o seu problema, como eu não tenho certeza eu entendi qual era o problema, mas não tenho uma idéia de como você poderia fazer este código um pouco mais legível:
<?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"));
?>
(mas eu também concordo com a nota de Chad Birch sobre o uso de loops em vez de repetir o código)
<?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 />";
}
?>
Oh querido, isso é algum código feio. Você realmente deve olhar para Loops (para / quando / etc) e Arrays .
O código que você não pode ser reduzida a isso:
Editado :. meu código tinha o mesmo problema que o original, fixada com solução de scronide, obrigado por apontar isso
<?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";
}
?>
Ou se você não se importa que combina as duas funções (recebendo os nomes dos meses, e imprimir os links) juntos, e você não precisa os nomes dos meses armazenados para qualquer outra coisa:
<?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";
}
?>