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

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

(2021 年 2 月 6 日)PHP8 対応

目次

サンプル・プログラム

解説:曜日と配列

0080: /**
0081:  * 曜日(日本語)を返す
0082:  * @param int $year  西暦年
0083:  * @param int $month 月
0084:  * @param int $day   日
0085:  * @return string 曜日(日本語)/FALSE:1970~2038年の間しか計算できない
0086: */
0087: function getWeekJp($year$month$day) {
0088:     static $tbl_week = array('', '', '', '', '', '', '', '');
0089: 
0090:     //引数エラーチェック
0091:     if ($year < 1970 || $year > 2038)   return FALSE;
0092: 
0093:     $num = date('w', mktime(0, 0, 0, $month$day$year));  //曜日番号
0094:     return $tbl_week[$num];
0095: }

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 を返すようにした。

解説:月の日数

0097: /**
0098:  * 指定した月の日数を返す
0099:  * @param int $year  西暦年
0100:  * @param int $month 月
0101:  * @return int 日数/FALSE:引数の異常
0102: */
0103: function getDaysInMonth($year$month) {
0104:     static $days = array(0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
0105:     if ($month < 1 || $month > 12)  return FALSE;
0106:     $days[2] = isleap($year) ? 29 : 28;       //閏年の判定
0107: 
0108:     return $days[$month];
0109: }

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

参考サイト

(この項おわり)
header