PHPで1ヶ月カレンダーを作る

(1/1)
今回は、PHPでカレンダーを作る方法を紹介する。日本語表記の曜日を求める方法に主眼を置いているので、表示レイアウトは簡便に済ませている。

(2021年2月6日)PHP8対応

目次

サンプル・プログラム

解説:曜日と配列

  80: /**
  81:  * 曜日(日本語)を返す
  82:  * @param   int $year  西暦年
  83:  * @param   int $month 月
  84:  * @param   int $day   日
  85:  * @return  string 曜日(日本語)/FALSE:1970~2038年の間しか計算できない
  86: */
  87: function getWeekJp($year, $month, $day) {
  88:     static $tbl_week = array('日', '月', '火', '水', '木', '金', '土', '日');
  89: 
  90:     //引数エラーチェック
  91:     if ($year < 1970 || $year > 2038)    return FALSE;
  92: 
  93:     $num = date('w', mktime(0, 0, 0, $month, $day, $year)); //曜日番号
  94:     return $tbl_week[$num];
  95: }

PHPの組み込み関数  date  は、指定した年月日の曜日を返すことができる。しかし、PHPは英語文化圏のソフトであるから、さすがに日本語で返すということはできない。
関数  date  の書式として 'w' を指定すると、曜日番号(0 = 日曜 ~ 6 = 土曜)を求めることができる。これを利用し、日本語の曜日を返すことを考える。

PHPには配列というデータ構造がある。Excelのような表形式のデータをあらわすための仕組みで、変数の一種である。
たとえば、曜日番号は以下のような表形式で表すことができる。
キー
0
1
2
3
4
5
6
これを配列であらわすと、
$変数名[0] = '日';
$変数名[1] = '月';
  ‥‥
$変数名[6] = '土';
となる。[ ] の中にキーを記述する。
いちいち変数名を記述するのは面倒なので、関数  array  を使い、
$変数名 = array('日', '月', '火', '水', '木', '金', '土', '日');
と表記することもある。このとき、暗黙の了解として、キーは [0] からはじまる。

このように、あらかじめ決まっている表形式のデータ構造を配列にあらわしたものを「テーブル」と呼んだりする。さまざまな方面で応用される手法である。

ユーザー関数 getWeekJp は、組み込み関数  date  が返す曜日番号をキーとし、日本語の曜日番号を値とする配列 $tbl_week をテーブルとしている。
与えられた年月日から曜日番号を算出するには、 mktime 、 date  という2つの組み込み関数を利用する。

なお、古いPHP処理系(Windows版 PHP4.xなど)では、関数 date に指定できる年号が1970年(昭和45年)~2038年の間に限られる。そこで、この範囲外の年号を指定した場合はエラーとし、FALSEを返すようにした。

解説:月の日数

  97: /**
  98:  * 指定した月の日数を返す
  99:  * @param   int $year  西暦年
 100:  * @param   int $month 月
 101:  * @return  int 日数/FALSE:引数の異常
 102: */
 103: function getDaysInMonth($year, $month) {
 104:     static $days = array(0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
 105:     if ($month < 1 || $month > 12)   return FALSE;
 106:     $days[2] = isLeapYear($year? 29 : 28;     //閏年の判定
 107: 
 108:     return $days[$month];
 109: }

月の日数を返すユーザー関数 getDaysInMonth も、配列を利用したテーブルをもつ。
1月から12月までの月の日数は概ね固定であるが、閏年の年だけ2月が29日になる。
閏年の判定関数については、「PHPで閏年かどうか判定する」で紹介したものを流用している。

参考サイト

(この項おわり)
header