« アイドル・ミラクルバイブル・シリーズ第3弾 | メイン | WX310K予約しました »
2005年11月10日
phpでカレンダー表示
仕事でカレンダー表示に関連したプログラムを作ったので、ついでにphpによるカレンダー作成の基本的な部分だけ紹介しておきます。大して難しいことではありません。
カレンダーをHTMLで作る場合、現状ではHTMLのtableを使って表組みにするか、それぞれのセルをdivで囲ってCSSで表組みにするか、大まかに二通りありますが、CSSでの表組みはCSS自体が複雑になってくるために、今回はtableを使っています。
htmlで作る際のtable構造は、「<td>日にち</td>」を7個出力して、日曜日の時は「<tr><td>日にち</td>」、土曜日の時は「<td>日にち</td></tr>」とすれば1週間が1段のよくある升目のカレンダーになります。日付を1日ずつ出力する際に上記の3種類に振り分けていけばよいわけです。
組み込み関数の豊富なphpにはカレンダーを作る上でも有用な関数が用意されています。指定の日付の曜日を取得するためには、
$youbi = date('w',$day);
とすると、$youbiには$dayの曜日を示す数字が入ります。日曜日が0で月曜日が1と順に増えていって土曜日が6です。
また、指定月の日数を取得するには、同じくdate関数を使い、
$nissu = date('t',$day);
とすると、$nissuには$dayの月の日数(28から31の数字)が入ります。
これらの関数を利用して、月の日数分を出力日に応じて前述の3パターンに振り分けて出力していきます。
しかし、上記のままプログラムすると月の第1週と最終週のtdの数が7個に満たなくなってしまいます。月の1日目が日曜日の場合ならそれでもいいのですが、当然ながら1日が月曜日の月もあれば、土曜日の月もあるので、毎月1日の曜日によって日にちが入っていない空欄のセル(「<td> </td>」)を出力しなければいけません。また、同じように月の最終日が土曜日で終われば問題はないのですが、他の曜日で終わる場合は、これも土曜日までの余った曜日を空欄のセル(「<td> </td>」)で埋めなくてはいけません。
この処理にも上記のdate関数を利用し、
【最初の週】$day1wdはdate関数で取得した1日の曜日の数字
for($n = 0; $n < $day1wd; $n++){
print "<td> </td>";
}
【最後の週】$dayLastwdはdate関数で取得した最終日の曜日の数字
for($n = $dayLastwd + 1; $n <= 6; $n++){
print "<td> </td>";
}
とします。
以上です。これだけできれば、カレンダーとして使えるものが表示できます。
後は日曜日を赤くするとか土曜日を青くするとか今日をハイライトするとか、必要に応じていろいろ細かい処理を加えていけばいいと思います。
これらの処理を組み込んで作ったのが以下のサンプルです。URLの引数として表示月を指定すればその月を、指定が無い場合は今月を表示します。さらにカレンダー内部で前月と次月に移動できるようにしてあります。
カレンダーサンプル(月指定なし)を表示
カレンダーサンプル(2005/8を指定)を表示
上記のサンプルソース
ちなみに、祝日を表示させるのは意外に難しいです。いや、難しくはないのですが、祝日は必ずしも毎年決まった日でははない上に、新しく制定されることもあるために、メンテナンスフリーで祝日を表示することはプログラムとしては不可能です。現実的には、祝日データを別途に持たせて、将来の祝日の日付がわかったときに、手動でデータ更新していく他はないと思います。
さらについでに言えば、このカレンダーは半永久的に使えるかと思いきや、32ビットOSの宿命として、現状では1902年1月から2038年1月までしか表示できません。2038年問題ですね。ま、それまでには64ビットOSが普及してくると思いますが。
※ものすごく余計なお世話かもしれませんが、Web上にあるこれらのサンプルスクリプトのカレンダーのスペルが「calender」となっているものが意外に多くてちょっと恥ずかしいです。正しいスペルは「calendar」です。
投稿者 Utayume : 2005年11月10日 20:12| 05 Work(Perl, PHP, etc)
AD
トラックバック
このエントリーのトラックバックURL:
http://ondes-martenot.info/MT/mt-tb.cgi/570
コメント
勉強になりました。ありがとうございました^^
投稿者 cokehead : 2005年12月27日 20:41
>cokeheadさん
コメントありがとうございます。
あまり綺麗なソースとは言えませんが、お役に立てば幸いです。
投稿者 うた夢 : 2005年12月28日 14:05