PHP で地球が爆発するまでカレンダーを出力できるコードを書いてみた

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

今回はグレゴリウス暦1年1月より、地球が爆発するまでのカレンダーを出力できるコードを作りましたので、せっかくなので公開しておきます。

使い方

1
<?php echo calender(2010, 6); ?>

第1引数に年を、第2引数に月を入れると、table で組まれたカレンダーを返します。

コード

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
function calender($year, $month) {
 
	$jpweek = Array('日', '月', '火', '水', '木', '金', '土');
	$days = cal_days_in_month(CAL_GREGORIAN, $month, $year);
	$week = jddayofweek(cal_to_jd(CAL_GREGORIAN, $month, 1, $year), 0);
	$day = array_pad(Array(), 42, 0);
 
	for($i = $week; $i <= $week + $days - 1; $i++) $day[$i] = $i - $week + 1;
 
	$calender  = '<table>';
	$calender .= '<tr>';
 
	foreach($jpweek as $value) $calender .= '<th>' . $value . '</th>';
 
	$calender .= '</tr>';
 
	foreach($day as $key => $value) {
		if($key % 7 == 0) $calender .= '<tr>';
		$calender .= '<td>';
		$calender .= ($value) ? $value : '&nbsp';
		$calender .= '</td>';
		if($key % 7 == 6) $calender .= '</tr>';
		if($key >= $week + $days - 1 && $key % 7 == 6) break;
	}
 
	$calender .= '</table>';
 
	return $calender;
 
}

本当に地球が爆発するまでのカレンダーを出力できるのか

カレンダーを出力させ続けて、カレンダーの結果に偏りがないか調査することで、カレンダーが正常に出力されているかを確認することにしました。偏りを調査するといっても、ひとつずつ調査していると寿命の方が先に来てしまうと思うので、その月の日数と始まりの曜日の統計を取る事にしました。

コード

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
set_time_limit(600);
$data['days'] = array_pad(Array(), 7, 0);
$data['week'] = array_pad(Array(), 7, 0);
for($i = 1; $i <= 1000000; $i++) {
	for($c = 1; $c <= 12;  $c++) {
		$calender = $this->Reservation->calender_check($i, $c);
		$data['days'][$calender['days']]++;
		$data['week'][$calender['week']]++;
	}
}
print_r($data);
 
function calender_check($year, $month) {
 
	$days = cal_days_in_month(CAL_GREGORIAN, $month, $year);
	$week = jddayofweek(cal_to_jd(CAL_GREGORIAN, $month, 1, $year), 0);
 
	$return['days'] = $days;
	$return['week'] = $week;
 
	return $return;
 
}

100万年の統計結果

Array
(
[days] => Array
(
[31] => 7000000
[28] => 757500
[30] => 4000000
[29] => 242500
)

[week] => Array
(
[1] => 1710000
[4] => 1712500
[0] => 1720000
[2] => 1717500
[5] => 1717500
[3] => 1712500
[6] => 1710000
)

)

コメント

コメントは受け付けていません。