<?php
//カレンダーと祝日情報の生成用に年月日の変数を作成
$year = date('Y');
$month = date('n');
$day = 1;
//祝日情報の配列(「label」はクラス名として利用します)
$holidays = getHolidays($year);
$holidays['label'] = 'holiday';
//テストイベント情報の配列
$tests = array('label' => 'test', date('Ymd') => '本日です(イベントのテスト)');
//祝日情報とテストイベント情報を連想配列にまとめます
$events = array($holidays, $tests);
//カレンダーの出力
echo getCalendar($year, $month, $day, $events);
//指定月のカレンダーを生成
function getCalendar($year, $month, $day, $events) {
//ヘッダー部分の曜日表示
$days = array('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat');
//本日を取得(20120512)
$today = date('Ymd');
//1行ごとの順番(1〜7)と、月全体の順番(1〜31(最大))
$num_row = 1;
$num_day = 1;
//月の始まる曜日から、前月の空白分を取得
$num_blank = date('w', mktime(0, 0, 0, $month, 1, $year));
//月の合計日
$total = $month == 2 ? ($year % 4 ? 28 : ($year % 100 ? 29 : ($year % 400 ? 28 : 29))) : (($month - 1) % 7 % 2 ? 30 : 31);
//カレンダーのヘッダー部分
$calendar = '<table class="calendar">';
$calendar .= '<thead><tr>';
while ($num_row <= count($days)) {
$calendar .= '<th>'.$days[$num_row-1].'</th>';
$num_row++;
}
$calendar .= '</tr></thead>';
//カレンダーの本体部分
$calendar .= '<tbody><tr>';
$num_row = 1;
//前月の空白分のセルを生成
while ($num_blank > 0) {
$label = '';
$label = ($num_row == 1) ? $label.' sun' : $label;
$calendar .= '<td class="'.$label.'"></td>';
$num_blank--;
$num_row++;
}
//1日〜31日(最大)までのセルを生成
while ($num_day <= $total) {
//「$label」は要素のクラス名として、「$content」は祝日などのイベント内容
$label = '';
$content = '';
//イベントの配列を走査するためのキーとして、「20120512」の形式で文字列を生成
$key = $year.sprintf('%02d', $month).sprintf('%02d', $num_day);
//左端なら日曜日、右端なら土曜日のためのラベル(クラス)を付加
$label = ($num_row == 1) ? $label.' sun' : $label;
$label = ($num_row == 7) ? $label.' sat' : $label;
//本日の場合もクラスを付加
$label = ($key == $today) ? $label.' today' : $label;
//イベントの配列があれば、配列を走査
if (isset($events)) {
//連想配列になっているイベントの配列($event)の中の、各イベント配列ごとに処理
for ($i = 0; $i < count($events); $i++) {
$label_event = (isset($events[$i]['label'])) ? $events[$i]['label'] : '';
//イベントの配列に一致するキー(20120512など)があれば、要素を付加
if (array_key_exists($key, $events[$i])) {
$label .= ' '.$label_event;
$content .= '<div class="'.$label_event.'">'.$events[$i][$key].'</div>';
}
}
}
$calendar .= '<td class="'.$label.'">';
$calendar .= '<div class="day">'.$num_day.'</div>';
$calendar .= $content;
$calendar .= '</td>';
$num_day++;
$num_row++;
//1行の終わり(7日目)ごとに、新しい行を開始
if ($num_row > 7) {
$calendar .= '</tr><tr>';
$num_row = 1;
}
}
//月の最終日以降の空白分のセルを生成
while ($num_row > 1 && $num_row <= 7) {
$label = '';
$label = ($num_row == 7) ? $label.' sat' : $label;
$calendar .= '<td class="'.$label.'"></td>';
$num_row++;
}
//カレンダーの終了
$calendar .= '</tr></tbody></table>';
//文字列として生成したカレンダーを返す
return $calendar;
}
?>