以前PHPについて質問させて頂きました。

同じ質問になってしまいますが、自分でソースを書いたらうまく動きません。デバッグしてくれたら嬉しいです。ポイントはそれなりにお支払いします。

http://q.hatena.ne.jp/1163814335
http://q.hatena.ne.jp/1164007516
この問題でさらに機能をつけたく、例えば今日の日付を取得します。今日が11/23であれば今日の日付を取得します。今日から月末までは$iにリンクをつけて(リンク先はなんでもOK)、1日から今日までの日付は日付($i)はリンクをつけません。リンクは"<td align=\"center\"><A href=XXX>$i</A></td>\n";につけます。このような条件文はどのようにしたらよいでしょうか?
ソースコードは下記のサイトにあります。このソースコードを改造したいと思っていますので、このコードを元にお願いいたします。
http://www.geocities.jp/kingmaskmelon/test.htm

回答の条件
  • URL必須
  • 1人5回まで
  • 登録:
  • 終了:2006/11/28 23:07:21
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:Mook No.3

回答回数1314ベストアンサー獲得回数393

ポイント250pt

失礼しました。

質問にもう一点、機能の追加がありましたね。

下記に変更例を掲載します。

ただし、drawCalender1 のみリンクの対応をしています。

drawCalender2 に関しては、同様にできると思いますので、そのままに保留してあります。

<?php

//function drawCalender1
function drawCalender1( $y ,$m ) {
//    $dateinfo = getdate(); //YEARとMonthを受け取る
    $hi = date('j');  // $dateinfo['mday']; //get today's date
    $mm = date('n');  // $dateinfo['mon'];
    $yy = date('Y');  // $dateinfo['year'];

    $t = mktime(0, 0, 0, $m, 1, $y); //$y年$m月1日のUNIXTIME 日付情報の作成
    $w = date( 'w', $t ); //1日の曜日(0:日~6:土)その月の曜日を求める
    $n = date( 't', $t ); //$y年$m月の日数

    print "<TD colspan=7 align=center>";
    print $y;
    print "年";
    print $m;
    print "月";
    print "</TD>";

print <<<DAY_TITLE
    <tr>
    <TD><FONT color="#ff0000">SUN</FONT></TD>
    <TD>MON</TD>
    <TD>TUE</TD>
    <TD>WED</TD>
    <TD>THU</TD>
    <TD>FRI</TD>
    <TD><FONT color="#0000ff">SAT</FONT></TD>
    </TR>
DAY_TITLE;

    for( $i = 1 - $w ; $i <= $n + 7 ; $i++ ){
        if ( ( ( $i + $w ) % 7 ) == 1 ) {
            print "<tr>\n";
        }
        switch ( ( $i + $w ) % 7 ) {
        case 0  :
            $tdClass = '"saturday"';
            break;
        case 1  : $tdClass = '"sunday"';
            break;
        default : $tdClass = '"weekday"';
            break;
        }
        if ( ( 0 < $i ) && ( $i <= $n ) ) { //1日から月の終わりまで
            if( mktime( 0, 0, 0, $m, $i, $y ) > mktime( 0,0,0, $mm, $hi, $yy ) ) { //リンク分岐 case0は土曜
                print "<td class=$tdClass align=\"center\"><A href='form2-2.php?year=$y&month=$m&day=$i'>$i</A></td>\n";
            }else {
                print "<td class=$tdClass align=\"center\">$i</A></td>\n";
            }
        } else {
            print "<td class=$tdClass>&nbsp;</td>\n";
        }
        if ((( $i + $w ) % 7 ) == 0 ) {
            print "</tr>\n";
            if ( $i >= $n ) {
                break;
            }
        }
    }
    print "</table>\n";
}

//function drawCalender2
function drawCalender2( $y ,$m ) {
    $t = mktime(0, 0, 0, $m, 1, $y); //$y年$m月1日のUNIXTIME 日付情報の作成
    $w = date('w', $t); //1日の曜日(0:日~6:土)その月の曜日を求める
    $n = date('t', $t); //$y年$m月の日数
    
    if($m==12){
        $m=1;
        $y=$y+1;
    }else{
        $m=$m+1;
    }

    print "<TD colspan=7 align=center>";
    print $y;
    print "年";
    print $m;
    print "月";
    print "</TD>";

print <<<DAY_TITLE
    <tr>
    <TD><FONT color="#ff0000">SUN</FONT></TD>
    <td>MON</td>
    <td>TUE</td>
    <td>WED</td>
    <td>THU</td>
    <td>FRI</td>
    <TD><FONT color="#0000ff">SAT</FONT></TD>
    </tr>
    <tr>
DAY_TITLE;
    for( $i = 1 - $w ; $i <= $n + 7 ; $i++ ){
        if ( ( ( $i + $w ) % 7 ) == 1 ) {
            print "<tr>\n";
        }
        if ( ( 0 < $i ) && ( $i <= $n ) ) {
            switch ( ( $i + $w ) % 7 ) {
            case 0:
                print "<td class=\"saturday\" align=\"center\"><A href='form2-2.php?year=$y&month=$m&day=$i'>$i</A></td>\n";
                break;
            case 1:
                print "<td class=\"sunday\" align=\"center\"><A href='form2-2.php?year=$y&month=$m&day=$i'>$i</A></td>\n";
                break;
            default :
                print "<td align=\"center\"><A href='form2-2.php?year=$y&month=$m&day=$i'>$i</A></td>\n";
                break;
            } //switch end
        } else {
            print "<td>&nbsp;</td>\n";
        }
        if ((( $i + $w ) % 7 ) == 0 ) {
            print "</tr>\n";
            if ( $i >= $n ) {
                break;
            }
        }
    }
    print "</table>\n";
}
?>

<?php
// データの初期設定
$monthLast = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31) ;

// うるう年の計算
function uruu($year) {
    $ret = 28 ;
    if (($year % 4) == 0) $ret = 29 ;
    if (($year % 100) == 0) $ret = 28 ;
    if (($year % 400) == 0) $ret = 29 ;
        return $ret;

    if ($getResult==29 && $getMonth==2){
        $monthLast[1]=29;
    }
}
?>

<HTML>
<style type="text/css">
<!--
td.sunday { background-color:#ffcccc;}
td.saturday { background-color:#ccffff;}
td.weekday { background-color:#ffffff;}
-->
</style>
<BODY>
    <TABLE border="1">
    <TBODY>
    <?php
        //第一テーブル
        drawCalender1(date('Y'),date('n'));
    ?>
    </TBODY>
    </TABLE>

    <TABLE border="1">
    <TBODY>
        <?php
        //第二テーブル
        drawCalender2(date('Y'),date('n'));
        ?>
    </TBODY>
    </TABLE>
</BODY>
</HTML>

一つ、アドバイスをさせていただくと、関数の外で設定した変数は、通常関数の中で参照できません。

参照したい場合は、関数の最初で

global $y;

のように記述が必要です。

PHP 基礎編4


他に問題があれば、回数コメントを有効にするか回答回数を増やしていただければ、補足説明いたします。

id:popattack

globalが問題だったのですね。まだコードをしっかり見ないと理解できないところがありますので、じっくりと読んでみます。ありがとうございます。

2006/11/28 22:11:40

その他の回答2件)

id:Mook No.1

回答回数1314ベストアンサー獲得回数393

ポイント50pt

原因は、{} の整合が崩れていたためです。

インデントのみ修正:オリジナル

function uruu($year) {
    $ret = 28 ;
    if (($year % 4) == 0) $ret = 29 ;
    if (($year % 100) == 0) $ret = 28 ;
    if (($year % 400) == 0) $ret = 29 ;
    return $ret;
}

    if ($getResult==29 && $getMonth==2){
    $monthLast[1]=29;
}

インデント修正後

// うるう年の計算
function uruu($year) {
    $ret = 28 ;
    if (($year % 4) == 0) $ret = 29 ;
    if (($year % 100) == 0) $ret = 28 ;
    if (($year % 400) == 0) $ret = 29 ;
        return $ret;

    if ($getResult==29 && $getMonth==2){
        $monthLast[1]=29;
    }
}

PHPエディタ

のような開発環境を使用すると、文法や{}の整合性をチェックしてくれるので、このようなエラーを発見しやすいと思います。


たいした問題ではないので、ポイントは規定値で結構ですよ。

id:popattack

こんにちは、Mook様にはお世話になっております。function uruuは特に使っていなく、いろいろ勉強していたときのコードがそのまま残っていてついていたので、必要がなく、function uruuは削除しましたが、直りません。

今日が28日なので、本来は1日から28日までのリンクが表示されなく、29日から30日までのリンクはさせたいとおもっていますが、直りません。

2006/11/28 22:04:42
id:okuryu No.2

回答回数72ベストアンサー獲得回数3

ポイント100pt
function drawCalender1( $y ,$m ) {

    global $hi;

    ...

}

関数の内部で $hi をグローバル宣言してみてはどうでしょうか。

関数の外部で宣言した変数を関数の内部で有効にするには グローバル宣言する必要があります。

http://www.php.net/manual/ja/language.variables.scope.php:PHP: 変数のスコープ - Manual]

id:popattack

globalが問題だったのですね。まだコードをしっかり見ないと理解できないところがありますので、じっくりと読んでみます。ありがとうございます。

2006/11/28 22:11:45
id:Mook No.3

回答回数1314ベストアンサー獲得回数393ここでベストアンサー

ポイント250pt

失礼しました。

質問にもう一点、機能の追加がありましたね。

下記に変更例を掲載します。

ただし、drawCalender1 のみリンクの対応をしています。

drawCalender2 に関しては、同様にできると思いますので、そのままに保留してあります。

<?php

//function drawCalender1
function drawCalender1( $y ,$m ) {
//    $dateinfo = getdate(); //YEARとMonthを受け取る
    $hi = date('j');  // $dateinfo['mday']; //get today's date
    $mm = date('n');  // $dateinfo['mon'];
    $yy = date('Y');  // $dateinfo['year'];

    $t = mktime(0, 0, 0, $m, 1, $y); //$y年$m月1日のUNIXTIME 日付情報の作成
    $w = date( 'w', $t ); //1日の曜日(0:日~6:土)その月の曜日を求める
    $n = date( 't', $t ); //$y年$m月の日数

    print "<TD colspan=7 align=center>";
    print $y;
    print "年";
    print $m;
    print "月";
    print "</TD>";

print <<<DAY_TITLE
    <tr>
    <TD><FONT color="#ff0000">SUN</FONT></TD>
    <TD>MON</TD>
    <TD>TUE</TD>
    <TD>WED</TD>
    <TD>THU</TD>
    <TD>FRI</TD>
    <TD><FONT color="#0000ff">SAT</FONT></TD>
    </TR>
DAY_TITLE;

    for( $i = 1 - $w ; $i <= $n + 7 ; $i++ ){
        if ( ( ( $i + $w ) % 7 ) == 1 ) {
            print "<tr>\n";
        }
        switch ( ( $i + $w ) % 7 ) {
        case 0  :
            $tdClass = '"saturday"';
            break;
        case 1  : $tdClass = '"sunday"';
            break;
        default : $tdClass = '"weekday"';
            break;
        }
        if ( ( 0 < $i ) && ( $i <= $n ) ) { //1日から月の終わりまで
            if( mktime( 0, 0, 0, $m, $i, $y ) > mktime( 0,0,0, $mm, $hi, $yy ) ) { //リンク分岐 case0は土曜
                print "<td class=$tdClass align=\"center\"><A href='form2-2.php?year=$y&month=$m&day=$i'>$i</A></td>\n";
            }else {
                print "<td class=$tdClass align=\"center\">$i</A></td>\n";
            }
        } else {
            print "<td class=$tdClass>&nbsp;</td>\n";
        }
        if ((( $i + $w ) % 7 ) == 0 ) {
            print "</tr>\n";
            if ( $i >= $n ) {
                break;
            }
        }
    }
    print "</table>\n";
}

//function drawCalender2
function drawCalender2( $y ,$m ) {
    $t = mktime(0, 0, 0, $m, 1, $y); //$y年$m月1日のUNIXTIME 日付情報の作成
    $w = date('w', $t); //1日の曜日(0:日~6:土)その月の曜日を求める
    $n = date('t', $t); //$y年$m月の日数
    
    if($m==12){
        $m=1;
        $y=$y+1;
    }else{
        $m=$m+1;
    }

    print "<TD colspan=7 align=center>";
    print $y;
    print "年";
    print $m;
    print "月";
    print "</TD>";

print <<<DAY_TITLE
    <tr>
    <TD><FONT color="#ff0000">SUN</FONT></TD>
    <td>MON</td>
    <td>TUE</td>
    <td>WED</td>
    <td>THU</td>
    <td>FRI</td>
    <TD><FONT color="#0000ff">SAT</FONT></TD>
    </tr>
    <tr>
DAY_TITLE;
    for( $i = 1 - $w ; $i <= $n + 7 ; $i++ ){
        if ( ( ( $i + $w ) % 7 ) == 1 ) {
            print "<tr>\n";
        }
        if ( ( 0 < $i ) && ( $i <= $n ) ) {
            switch ( ( $i + $w ) % 7 ) {
            case 0:
                print "<td class=\"saturday\" align=\"center\"><A href='form2-2.php?year=$y&month=$m&day=$i'>$i</A></td>\n";
                break;
            case 1:
                print "<td class=\"sunday\" align=\"center\"><A href='form2-2.php?year=$y&month=$m&day=$i'>$i</A></td>\n";
                break;
            default :
                print "<td align=\"center\"><A href='form2-2.php?year=$y&month=$m&day=$i'>$i</A></td>\n";
                break;
            } //switch end
        } else {
            print "<td>&nbsp;</td>\n";
        }
        if ((( $i + $w ) % 7 ) == 0 ) {
            print "</tr>\n";
            if ( $i >= $n ) {
                break;
            }
        }
    }
    print "</table>\n";
}
?>

<?php
// データの初期設定
$monthLast = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31) ;

// うるう年の計算
function uruu($year) {
    $ret = 28 ;
    if (($year % 4) == 0) $ret = 29 ;
    if (($year % 100) == 0) $ret = 28 ;
    if (($year % 400) == 0) $ret = 29 ;
        return $ret;

    if ($getResult==29 && $getMonth==2){
        $monthLast[1]=29;
    }
}
?>

<HTML>
<style type="text/css">
<!--
td.sunday { background-color:#ffcccc;}
td.saturday { background-color:#ccffff;}
td.weekday { background-color:#ffffff;}
-->
</style>
<BODY>
    <TABLE border="1">
    <TBODY>
    <?php
        //第一テーブル
        drawCalender1(date('Y'),date('n'));
    ?>
    </TBODY>
    </TABLE>

    <TABLE border="1">
    <TBODY>
        <?php
        //第二テーブル
        drawCalender2(date('Y'),date('n'));
        ?>
    </TBODY>
    </TABLE>
</BODY>
</HTML>

一つ、アドバイスをさせていただくと、関数の外で設定した変数は、通常関数の中で参照できません。

参照したい場合は、関数の最初で

global $y;

のように記述が必要です。

PHP 基礎編4


他に問題があれば、回数コメントを有効にするか回答回数を増やしていただければ、補足説明いたします。

id:popattack

globalが問題だったのですね。まだコードをしっかり見ないと理解できないところがありますので、じっくりと読んでみます。ありがとうございます。

2006/11/28 22:11:40
  • id:tobeoscontinue
    drawCalender1()とdrawCalender2()に
    global $hiが必要です。

    日曜の場合に
    "<td class=\"sunday\" align=\"center\">$i</A></td>\n";
    となっていますがprintが無く、</A>が余計です。

    drawCalender2()で
    if($m==12){
    $m=1;
    $y=$y+1;
    }else{
    $m=$m+1;
    }
    をしてからmktime()する必要があります。(上へ移動)
  • id:Mook
    drawCalender2 の方はうまくいったでしょうか?
    過大なポイントを頂いたお礼に、少しばかり補足説明です。

    -----------------------
    (1)大域変数について
    -----------------------
    多くの方が指摘されていますし、もう理解されていると思いますが、関数外の変数を参照する場合は、

    <?php
       $gYear = 2006;
       $lYear = 2006;

    function localFunc() {
       global $gYear;
       print $gYear; // 2006 を表示
       print $lYear; // 表示されない
    }
    ?>
    <html>
    <head></head>
    <body>
       <?php localFunc(); ?>
    </body>
    </html>

    というように使います。
    先ほどの回答ではこのやり方をせず、関数の中に移してしまいました。

    -----------------------
    (2)日付について
    -----------------------
    日付の取得は date() や mktime() を使いますが、詳細なオプションを理解すると応用が広がります。
    また、これらはオプションの省略が可能で、この点も把握すると良いかと思います。
       今日の日にち・・・date('j')
       今月の月・・・・・date('n')
    date 参照(http://jp2.php.net/date)
    mktime 参照(http://php.benscom.com/manual/ja/function.mktime.php)

    -----------------------
    (3)デバッグ方法
    -----------------------
    デバッグ方法としては、先に紹介したエディタ等を使うのも有効ですが、もう一つ、デバッグ方法として、ブラウザのソースを表示で結果を確認するのも一法です。
    期待した結果と異なる場合、それを出力している部分を特定することで、コードの問題点を早く見つけることができます。

    御参考までに。
    ~~~~~~~~~~~~~~~~~
    しばらくはこちらをウォッチリストに登録して見るようにします。
    もし何か質問があればこちらにコメントを付けていただければ、回答いたします。
  • id:popattack
    Mook様
    このコードだと関数が2つ使われていて無駄のような
    気がします。何かすっきり一つにまとめれるような
    良い方法はないでしょうか?
  • id:Mook
    多少原型から離れてしまいましたが、改良したものを提示します。
    修正した点は以下の通りです。
    (1)変数を判りやすく変更
    (2)drawCalender を拡張し、指定した月からのオフセットを指定できるようにした

    不明な点は、コメントで追記ください。

    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    注意:インデント表示のためにスペースが全角になっています。
    半角に変換して、実行してください。
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    <html>
    <head>
    <style type="text/css">
    <!--
    td.sunday { background-color:#ffcccc;}
    td.saturday { background-color:#ccffff;}
    td.weekday { background-color:#ffffff;}
    -->
    </style>
    <?php
    // -------------------------------------------------------------------------
    // カレンダー表示関数
    // -------------------------------------------------------------------------
    function drawCalender( $calYear, $calMonthBase, $calManthOffset ) {
    // -------------------------------------------------------------------------
    // $calYear 年 $calMonthBase 月 を基点として
    // $calManthOffset ヶ月先(マイナスの場合は前)のカレンダーを表示
    // -------------------------------------------------------------------------
      $today     = date('j'); // 今日の日
      $thisMonth   = date('n'); // 今月の月
      $thisYear   = date('Y'); // 今年の年(4桁)

    // 表示月の計算
      $calMonth = $calMonthBase + $calManthOffset;
      while( $calMonth < 0 ) {
        $calMonth += 12;
        $calYear--;
      }
      while( $calMonth > 12 ) {
        $calMonth -= 12;
        $calYear++;
      }

      $firstDay = date( 'w', mktime(0, 0, 0, $calMonth, 1, $calYear) );   //1日の曜日(0:日~6:土)その月の曜日を求める
      $dayNumOfMonth = date( 't', mktime(0, 0, 0, $calMonth, 1, $calYear) ); //$y年$m月の日数
      print "<table border=\"1\">\n";

    // 変数を{} で囲めば前後に文字があっても "" 中で記述できる
      print "<tr><td colspan=7 align=center>{$calYear}年{$calMonth}月</td></tr>\n";

    // 曜日の表示
    print <<<DAY_TITLE
      <tr>
      <td><font color="#ff0000">SUN</font></td>
      <td>MON</td>  <td>TUE</td>  <td>WED< /td>  <td>THU</td>  <td>FRI</td>
      <td><font color="#0000ff">SAT</font></td>
      </tr>
    DAY_TITLE;

    // 日付の表示
      for( $day = 1 - $firstDay ; $day <= $dayNumOfMonth + 7 ; $day++ ){
    // 日曜なら列を開始する
        if ( ( ( $day + $firstDay ) % 7 ) == 1 ) {
          print "<tr>\n";
        }
        switch ( ( $day + $firstDay ) % 7 ) {
        case 0 :
          $tdClass = '"saturday"'; // 日曜の css クラス
          break;
        case 1 : $tdClass = '"sunday"'; // 土曜の css クラス
          break;
        default : $tdClass = '"weekday"'; // 平日の css クラス
          break;
        }
        if ( ( 0 < $day ) && ( $day <= $dayNumOfMonth ) ) { //1日から月の終わりまで
    // 今日以降はリンクを表示
          if( mktime( 0, 0, 0, $calMonth, $day, $calYear ) > mktime( 0,0,0, $thisMonth, $today, $thisYear ) ) {
            print "<td class=$tdClass align=\"center\"><a href='form2-2.php?year=$y&month=$m&day=$day'>$day</a></td>\n";
          }else {
            print "<td class=$tdClass align=\"center\">$day</td>\n";
          }
        } else {
    // 空白日の表示
          print "<td class=$tdClass>&nbsp;</td>\n";
        }
    // 土曜なら列を閉じる
        if ((( $day + $firstDay ) % 7 ) == 0 ) {
          print "</tr>\n";
    // 最終週の土曜なら終了
          if ( $day >= $dayNumOfMonth ) {
            break;
          }
        }
      }
      print "</table>\n";
    }
    ?>
    </head>
    <body>
      <center>
      <table width="90%">
       <tr>
        <td valign="top"><?php drawCalender( date('Y'), date('n'), -1 ); ?></td> <!--- 先月 --->
        <td valign="top" ><?php drawCalender( date('Y'), date('n'), 0 ); ?></td> <!--- 今月 --->
        <td valign="top" ><?php drawCalender( date('Y'), date('n'), 1 ); ?></td> <!--- 来月 --->
       </tr>
      </table>
      </center>
    </body>
    </html>
  • id:Mook
    だいぶ日数もたちましたので、私のウォッチリストからはずしたいと思います。

    悪しからず、ご了承ください。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません