PHP で変動的にシンプルなカレンダーを出力するソースコード

本日は早めに帰宅したので、2038年1月まで使えるカレンダーを出力する関数を書いてみました。

1
2
3
4
5
<?php
calender();	// 今月のカレンダー
calender(-1);	// 先月のカレンダー
calender(1);	// 来月のカレンダー
?>

引数には現在の月との誤差を書きます。
デフォルトは0が設定してありますです。

ソースコード

独学しながら一人ぼっちでプログラム書いてるので、これが良いのか悪いのかは分かりません。ぜひプログラマーの皆様、採点お願いします!

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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
<?php
function calender($month = 0) {
 
	$now = time();
 
	$today['year'] = date("Y", $now);
	$today['month'] = date("n", $now);
	$today['day'] = date("j", $now);
 
	$data['year'] = $today['year'];
	$data['month'] = $today['month'];
	$data['day'] = $today['day'];
 
	$data['month'] += $month;
 
	while($data['month']>12) {
		$data['month'] -= 12;
		$data['year']++;
	}
 
	while($data['month']<1) {
		$data['month'] += 12;
		$data['year']--;
	}
 
	$data['timestamp'] = mktime(0, 0, 0, $data['month'], 1, $data['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']) {
			if($month==0) {	
				switch($i%7){
					case 0:
						if($day==$today['day']) {
							$calender.='<tr><td class="sunday today">'.$day.'</td>'."\n";
							break;
						} else {
							$calender.='<tr><td class="sunday">'.$day.'</td>'."\n";
							break;	
						}
					case 6:
						if($day==$today['day']) {
							$calender.='<td class="saturday today">'.$day.'</td></tr>'."\n";
							break;
						} else {
							$calender.='<td class="saturday">'.$day.'</td></tr>'."\n";
							break;
						}
					default:
						if($day==$today['day']) {
							$calender.='<td class="today">'.$day.'</td>'."\n";
							break;
						} else {
							$calender.='<td>'.$day.'</td>'."\n";
							break;
						}
				}
			} else {	
				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>{$data['year']}年{$data['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年10月のカレンダー</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">&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>1</td>
<td>2</td>
<td class="saturday">3</td></tr>
<tr><td class="sunday">4</td>
<td>5</td>
<td>6</td>
 
<td>7</td>
<td>8</td>
<td>9</td>
<td class="saturday">10</td></tr>
<tr><td class="sunday">11</td>
<td>12</td>
<td>13</td>
<td>14</td>
<td>15</td>
 
<td>16</td>
<td class="saturday">17</td></tr>
<tr><td class="sunday">18</td>
<td>19</td>
<td>20</td>
<td>21</td>
<td>22</td>
<td>23</td>
<td class="saturday">24</td></tr>
 
<tr><td class="sunday">25</td>
<td>26</td>
<td>27</td>
<td>28</td>
<td>29</td>
<td>30</td>
<td class="saturday">31</td></tr>
</table>

結構使いまわせそうです。

今後の課題

祝日をどう出力しようか悩んでいます。
Google Calender API で、日本の祝日カレンダーから取得してしまおうと考えているのですが、それはどうなのかなぁ…という感じです。
通常はどのようにやるのでしょうか、というか祝日はさすがに手動なんですかね。

コメント

  1. PHP でシンプルに好きな年月のカレンダーを出力するコード | ウェブルさんのコメント

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

  2. PHP で地球が爆発するまでカレンダーを出力できるコードを書いてみた | ウェブルさんのコメント

    [...] 以前PHP で変動的にシンプルなカレンダーを出力するソースコードを書いてみましたが、タイムスタンプを使っていたので、1970年から2038年までしかカレンダーを出力できませんでした。 [...]