PHP でシンプルに好きな年月のカレンダーを出力するコード

先日書いた PHP で変動的にシンプルなカレンダーを出力するソースコードに少し改良を加えました。年月を入れてカレンダーが出力した方が汎用的ですね。

で、さっそくですが、2009年11月のカレンダーを出力したい場合は以下のように書きます。

1
2
3
<?php
calender(2009, 11);
?>

引数には現在の年と月を書きます。

ソースコード

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
<?php
function calender($year, $month) {
 
	$now = time();
 
	$data['timestamp'] = mktime(0, 0, 0, $month, 1, $year);
 
	$data['count_day'] = date("t", $data['timestamp']);
	$day = date("w", $data['timestamp'])*-1;
	$data['week'] = array("日","月","火","水","木","金","土");
 
	$calender='<table border="1">'."\n";
	$calender.='<tr>'."\n";
	foreach($data['week'] as $key => $value) {
		switch($key) {
			case 0:
				$calender.='<th class="sunday">'.$value.'</th>'."\n";
				break;
			case 6:
				$calender.='<th class="saturday">'.$value.'</th>'."\n";
				break;
			default:
				$calender.='<th>'.$value.'</th>'."\n";
				break;
		}
	}
	$calender.='</tr>'."\n";
	$i=0;
	$p=1;
	do {
		$day++;
		if($day > 0 && $day <= $data['count_day']) {
			switch($i%7){
				case 0:
					$calender.='<tr><td class="sunday">'.$day.'</td>'."\n";
					break;
				case 6:
					$calender.='<td class="saturday">'.$day.'</td></tr>'."\n";
					break;
				default:
					$calender.='<td>'.$day.'</td>'."\n";
					break;
			}
		} else {
			if($i%7==0 && $day > $data['count_day']) {
				$p=0;
			}
			if($p) {
				switch($i%7){
					case 0:
						$calender.='<tr><td class="sunday">&nbsp;</td>'."\n";
						break;
					case 6:
						$calender.='<td class="saturday">&nbsp;</td></tr>'."\n";
						break;
					default:
						$calender.='<td>&nbsp;</td>'."\n";
						break;
				}
			}
		}
	} while (++$i && $i < 42);
	$calender.='</table>'."\n";
 
echo <<< DOC
<p>{$year}年{$month}月のカレンダー</p>
{$calender}
DOC;
 
}
?>

出力結果

今月(2009年10月)の出力は以下になります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<p>2009年11月のカレンダー</p>
<table border="1">
<tr>
<th class="sunday"></th>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
<th class="saturday"></th>
 
</tr>
<tr><td class="sunday">1</td>
<td>2</td>
<td>3</td>
<td>4</td>
<td>5</td>
<td>6</td>
<td class="saturday">7</td></tr>
<tr><td class="sunday">8</td>
 
<td>9</td>
<td>10</td>
<td>11</td>
<td>12</td>
<td>13</td>
<td class="saturday">14</td></tr>
<tr><td class="sunday">15</td>
<td>16</td>
<td>17</td>
 
<td>18</td>
<td>19</td>
<td>20</td>
<td class="saturday">21</td></tr>
<tr><td class="sunday">22</td>
<td>23</td>
<td>24</td>
<td>25</td>
<td>26</td>
 
<td>27</td>
<td class="saturday">28</td></tr>
<tr><td class="sunday">29</td>
<td>30</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td class="saturday">&nbsp;</td></tr>
</table>

これは実用的だきっと。

今後の課題

やっぱり祝日をどうやって出力しようかなぁーって感じですね。なかなか他のことばっかりやってて制作が進みません。
あと、お察しの通り2038年問題に引っかかっています。この辺は2038年までの私に任せるとしましょう。

コメント

  1. カレンダーの庭園というサイトを制作しました | ウェブルさんのコメント

    [...] カレンダーの庭園というサイトを制作しました。 PHP でシンプルに好きな年月のカレンダーを出力するコードを使って3時間くらいで作った即席サイトです。2038年問題を知らなかったので [...]