2009-04-17 2 views
3

以下のコードは、今月のページのリンクをリンクリストの一番上に移動するウェブサイトメニューに使用しています。このPHPコードに起因する月エラーの最終日はどのように修正するのですか?

しかし、これは4月などの31ヶ月で失敗します。ほとんどのリンクで同じ月に2つのリンクが得られます。私はphpが日付を生成する方法の問題を読んだが、このコードをどのように変更するのか分からない。

誰かphp博士はそれに刺すつもりですか?ありがとう

<?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 /> 
+2

あなたがこれを見て、聞いてはいけませんあなた自身がこれを行うより良い方法があるはずです... "ループと配列、親切な、ループと配列。 –

+0

私は良い方法があると思ったが、私は一度に1つの質問にとどまるだろう。私はまだPHPを学んでいて、ほとんどがウェブページ用のかなり静的なコードを知っています.... – markratledge

答えて

2

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

+0

これは素晴らしいです;他の回答は今月31日には失敗します。ありがとう、マーク – markratledge

4

mktimeではなくstrtotime()を使用して調べることができます。 strtotime()で行うことができるので

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

数ヶ月のうち1日に正確にある日に戻ってきます。たとえ閏年であっても。

0

ああ、それはいくつかの醜いコードです。 Loops(for/while/etc)とArraysを実際に調べる必要があります。

あなたがそこに持っているコードは、これに減らすことができます。編集

私のコードは、それを指摘して感謝を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"; 
} 
?> 

それとも、2つの機能を組み合わせる(月の名前を取得し、リンクを印刷する)気にしない、とあなたは何か他のもののために保存された月の名前を必要としない場合:

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

これはまた、元のコードの問題を保持します:+ $ i月は、翌月に存在しない日付では機能しません。 – scronide

+0

ああ、そうだ、もし3月31日かそれ以外のものなら、それは壊れるだろう。編集、ありがとう。 –

+0

うん、それは醜いコードです。しかし、私は一度に一つの質問をすると思っていました。すべての答えをありがとう - マーク – markratledge

0

これはあなたの問題を解決するかどうか、私は問題が何であったか理解し、本当にわからないんだけど、私はあなたがこのコードは少し読みやすくすることができる方法のアイデアを持っているとして、私は、見当がつかない:

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

使用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 
} 
?> 
関連する問題