以前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 : ' '; $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
))
コメント