今月のカレンダー:テーブル
そふぃのPHP入門 >> サンプルスクリプト >> 日付・時刻関連 >> 今月のカレンダー:テーブル

今月のカレンダー:テーブル

今月のカレンダー(テーブル表示)

今度はカレンダーをテーブルで表示します。以下のようなカレンダーが出来上がります。

2017年5月のカレンダー
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      

取得したい値などは前回の今月のカレンダー(一覧表示)と同じですので省きます。

テーブルで表示するので<table>関連のタグを一通り使います。

  1. ○○年○月の部分はテーブルの<caption>タグを使います。
  2. 見出しタグ<th>に日~土の曜日を配置します。
  3. 日付が存在する間、日にちを<td>タグの中に挿入しながらループし、空白セルには「&nbsp;」と空白を挿入します。
  4. それだけでは1行で表示されてしまうので曜日の数(7回)だけループしたら行を変えます。テーブルなので行を変えるには</tr><tr>タグを挿入します。
  5. 土曜・日曜と今日の日付の色を変更するのでスタイルシートの設定をします。
    • 日曜―文字色:(#CC3300)
    • 土曜―文字色:(#0033CC)
    • 今日―背景色:(silver)

使用する関数は前回使用したdate()mktime()関数に加えてcheckdate()関数です。

参考関数

  • date() ---- 日付・時刻を書式化する
  • mktime() ---- 指定した日時のUNIXタイムスタンプを取得する
  • checkdate() ---- 日付の妥当性を確認する(グレゴリオ暦)

書式

  • string date( string format [, int timestamp ] )

date()は最も基本的な日付関数です。タイムスタンプから日付をフォーマットします。

使用するフォーマット文字は以下の通りです。今月のカレンダー(一覧表示)と一緒ですが、再度表にしておきます。

Y 年を4桁で取得
n 月を取得(先頭に0をつけない)
j 日を取得(先頭に0をつけない)
t 指定した月の日数を取得
w 曜日の数値を取得(0:日曜日~6:土曜日まで)

mktime()は目的の日時のタイムスタンプを取得できます。引数は時、分、秒、月、日、年という日本人にはあまり馴染まない順番で指定しますので注意してください。

書式

  • int mktime( [ int hour [, int minute [, int second [, int month [, int day [, int year [, int is_dst ]]]]]]] )

checkdate()関数は引数に指定した日付が存在すればtrueを、存在しなければfalseを返してくる便利な関数です。これをループの条件式に使います。

書式

  • bool checkdate( int month , int day , int year )

PHPカレンダーサンプルソース

  1. <?php
  2. $now_year = date("Y"); // 現在の年を取得
  3. $now_month = date("n"); // 在の月を取得
  4. $now_day = date("j"); // 現在の日を取得
  5. // 曜日の配列作成
  6. $weekday = array( "", "", "", "", "", "", "" );
  7. // 1日の曜日を数値で取得
  8. $fir_weekday = date( "w", mktime( 0, 0, 0, $now_month, 1, $now_year ) );
  9.  
  10. echo '<table border="1" cellspacing="0" cellpadding="0" style="text-align:center;">';
  11. // 見出し部分<caption>タグ出力
  12. echo "<caption style=\"color:black; font-size:14px; padding:0px;\">"
  13.  .$now_year."".$now_month."月のカレンダー
  14.  </caption>\n";
  15.  
  16. echo "<tr>\n";
  17.  
  18. // 曜日セル<th>タグ設定
  19. $i = 0; // カウント値リセット
  20. while( $i <= 6 ){ // 曜日分ループ
  21.  
  22. //-------------スタイルシート設定---------------------------------
  23.     if( $i == 0 ){ // 日曜日の文字色
  24.         $style = "#C30";
  25.     }
  26.     else if( $i == 6 ){ // 土曜日の文字色
  27.         $style = "#03C";
  28.     }
  29.     else{ // 月曜~金曜日の文字色
  30.         $style = "black";
  31.     }
  32. //-------------スタイルシート設定終わり---------------------------
  33.  
  34.     // <th>タグにスタイルシートを挿入して出力
  35.     echo "\t<th style=\"color:".$style."\">".$weekday[$i]."</th>\n";
  36.     $i ++; //カウント値+1
  37. }
  38.  
  39. // 行の変更
  40. echo "</tr>\n";
  41. echo "<tr>\n";
  42.  
  43. $i = 0; //カウント値リセット(曜日カウンター)
  44. while( $i != $fir_weekday ){ //1日の曜日まで空白(&nbsp;)で埋める
  45.     echo "\t<td>&nbsp;</td>\n";
  46.     $i ++;
  47. }
  48.  
  49. // 今月の日付が存在している間ループする
  50. for( $day=1; checkdate( $now_month, $day, $now_year ); $day++ ){
  51.  
  52.     //曜日の最後まできたらカウント値(曜日カウンター)を戻して行を変える
  53.     if( $i > 6 ){
  54.         $i = 0;
  55.         echo "</tr>\n";
  56.         echo "<tr>\n";
  57.     }
  58.  
  59. //-------------スタイルシート設定-----------------------------------
  60.     if( $i == 0 ){ //日曜日の文字色
  61.         $style = "#C30";
  62.     }
  63.     else if( $i == 6 ){ //土曜日の文字色
  64.         $style = "#03C";
  65.     }
  66.     else{ //月曜~金曜日の文字色
  67.         $style = "black";
  68.     }
  69.  
  70.     // 今日の日付の場合、背景色追加
  71.     if( $day == $now_day ){
  72.         $style = $style."; background:silver";
  73.     }
  74. //-------------スタイルシート設定終わり-----------------------------
  75.  
  76.     // 日付セル作成とスタイルシートの挿入
  77.     echo "\t<td style=\"color:".$style.";\">".$day."</td>\n";
  78.  
  79.     $i++; //カウント値(曜日カウンター)+1
  80. }
  81.  
  82. while( $i < 7 ){ //残りの曜日分空白(&nbsp;)で埋める
  83.     echo "\t<td>&nbsp;</td>\n";
  84.     $i++;
  85. }
  86. echo "</tr>\n";
  87. echo "</table>\n";
  88. ?>

出力結果

2017年5月のカレンダー
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      

一覧表示に比べて大分カレンダーらしくなりました。