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

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

サンプル・プログラム

プログラムを実行する

ダウンロード(PHP4/5共用)

曜日と配列

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

0025: /**
0026:  * 曜日(日本語)を返す
0027:  * @param int $year  西暦年
0028:  * @param int $month 月
0029:  * @param int $day   日
0030:  * @return string 曜日(日本語)/FALSE:1970〜2038年の間しか計算できない
0031: */
0032: function getWeekJp($year$month$day) {
0033:     static $tbl_week = array('', '', '', '', '', '', '', '');
0034: 
0035:     //引数エラーチェック
0036:     if ($year < 1970 || $week > 2038)   return FALSE;
0037: 
0038:     $num = date('w', mktime(0, 0, 0, $month$day$year));  //曜日番号
0039:     return $tbl_week[$num];
0040: }

PHP には配列というデータ構造がある。Excel のような表形式のデータをあらわすための仕組みで、変数の一種である。
たとえば、曜日番号は以下のような表形式で表すことができる。
space
キー
0
1
2
3
4
5
6

space
これを配列であらわすと、
$変数名[0] = '日';
$変数名[1] = '月';
  ‥‥
$変数名[6] = '土';
となる。[ ] の中にキーを記述する。
いちいち変数名を記述するのは面倒なので、関数  array  を使い、
$変数名 = array('日', '月', '火', '水', '木', '金', '土', '日');
と表記することもある。このとき、暗黙の了解として、キーは [0] からはじまる。
space
このように、あらかじめ決まっている表形式のデータ構造を配列にあらわしたものを「テーブル」と呼んだりする。さまざまな方面で応用される手法である。
space
ユーザー関数 getWeekJp は、組み込み関数  date  が返す曜日番号をキーとし、日本語の曜日番号を値とする配列 $tbl_week をテーブルとしている。
与えられた年月日から曜日番号を算出するには、 mktime 、 mktime  という 2 つの組み込み関数を利用する。
space
なお、古い PHP 処理系(Windows版 PHP4.x など)では、関数 date に指定できる年号が 1970 年~2038 年の間に限られる。そこで、この範囲外の年号を指定した場合はエラーとし、FALSE を返すようにした。

月の日数

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

0042: /**
0043:  * 指定した月の日数を返す
0044:  * @param int $year  西暦年
0045:  * @param int $month 月
0046:  * @return int 日数/FALSE:引数の異常
0047: */
0048: function getDaysInMonth($year$month) {
0049:     static $days = array(0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
0050:     if ($month < 1 || $month > 12)  return FALSE;
0051:     $days[2] = isleap($year) ? 29 : 28;       //閏年の判定
0052: 
0053:     return $days[$month];
0054: }

参考書籍

参考サイト

この項つづく
header