2010年10月29日(金)大体の話は夜中に起きる。

昨日の日記でPHPで作成するカレンダーに祝日を掲載しましたよ。みたいな内容を書いた訳なんだがその後更にスクリプトの記述を見直してどうたらこうたら。

2010年10月28日(木)就農

まぁいいや。そう言えばとまむさんのサイトで使って表示しているカレンダー、祝日表示に一切対応していなかったな。そう言えば。あぁそう言えば。
なんかその事を思い出したんでちょっくらそこら辺をいじくって祝日対応にしてみる事にする。「祝日対応PHPカレンダー」のソースを提示しているサイトは
幾つかあったが「えっ?そう言う書き方するのか?俺にはねぇわ」としか思えないんでやっぱり自分で書いた方がフィットするんだな。とか思った。

…と書いた。「祝日と祝日の間に挟まれた日にちは祝日になる」には対応しない。…みたいな内容も書いたんだが、いや対応しろよと。ははぁーん?
もしかして対応出来ないからそんな事を口にしてごまかしてるだけなんじゃないのかしら〜?みたいな事でも思われたら「なにをー(笑)」なんで。以下概要。

祝日を収納したarrayを3つに分ける。「1:ゴールデンウィーク」「2:曜日固定の祝日なんだがとまむさん専用みたいな感のある『群馬県民の日』、『埼玉県民の日』
などのいわゆる俺専用(に近い内容)の日付。とまむさん埼玉県民じゃないでしょ?とか言われたら『記念切符が売れれば鉄道会社の金になるだろうが(笑)で」
「3:みどりの日、文化の日などの曜日が固定されている祝日」とまずは3つに分ける。それとは別に「春分の日」「秋分の日」を計算式で求めた内容も変数に入れる。

祝日の内容を入れた変数はのべ5ヶ所。「曜日が固定されている祝日、春分の日、秋分の日」をarray_unshiftを使って同じ変数に入れる。
それからcheckdateを使ってのwhileでとあるカレンダーの月の最初から最後までをループしながら出力する。その間に分岐条件を入れて祝日を算出する。以下概要。

「1:ゴールデンウィークの配列次第で5月6日も休みになる。3つに分けたarrayの中からゴールデンウィーク『専用の』arrayの中身をin_arrayで検索。
曜日の数字が0である事と合わせて検索を掛ける。5月3日、5月4日、5月5日。この内、1つでも日曜日があった場合には5月6日を休みにする為、arrayに追加する」

「2:祝日と日曜日が同じ場合には翌日に振り替える。3つに分けたarrayの中から『曜日が固定されている祝日』のarrayの中身をin_arrayで検索。
曜日の数字が0である事と合わせて検索を掛ける。適合したら今度はarray_searchを使って適合したin_arrayの中にある該当したarrayに対応するkeyを探し出す。
例えば1月1日が日曜日だった場合、曜日が固定されている祝日のarrayの中身の1番最初に1月1日は収納されている。適合するkeyは『0』となる。
arrayを入れた変数にkeyの数字『0』を添えたその『変数+keyの添え字0』に『1』を足した内容を別途arrayに収納する。これで『1月2日』も祝日として追加される」

「3:いわゆるハッピーマンデー法案で月曜日に振り替えられた祝日の中から、敬老の日を除いた成人の日、海の日、体育の日の3つの祝日を求める事になる。
まずは月曜日である事が絶対条件。あとはその該当する月曜日が当てはまる日付を求めて適合した内容を祝日として収納する。敬老の日に限っては別に追加する」

「4:敬老の日は、いわゆる『シルバーウィーク』に当てはまる可能性がある。例えば2009年。敬老の日が9月21日で秋分の日が9月23日。その間に挟まれた
9月22日は 国民の祝日に関する法律第3条第3項に規定する休日 に当てはまるので祝日扱いとなる。そこも同時に求める為に敬老の日だけは別に扱う。
まずは先に9月の第3月曜日を求めて適合した日付をarrayに追加する。その9月第3月曜日の日付と、計算式で求めた秋分の日とを比較して、その数字の差が
『2』だった場合には(9月21日、9月23日、その差2日)、その9月第3月曜日の翌日(9月22日)も休みになるので、その翌日『も』arrayに追加する」

以上の経過を経て、祝日専用のarrayの中身を整えて、普通の日曜日とin_arrayを使って検索した祝日専用array(3パターン)の中身に該当する日付を
休日扱いとして赤くして、その後に土曜日は青くして、それ以外の平日は普通に取り扱う。と言う流れで一応の祝日は一通り網羅致しました。と言うのが俺の近況。

一応その上記の展開で作ったPHPカレンダーなんだが、2009年のシルバーウィーク(和製英語)の定義としては「9月20日から9月23日までの4連休」が基本で
「9月19日(普通の土曜日、特に何かしらの祝日と言う訳ではない)も含めると5連休になる」と言うのが定義な訳でその定義と合ってるかどうか見てみた訳で。

…うん。確かに20から23までの4日間が真っ赤だわ。そんな2009年9月のカレンダーになっている。次は?2015年?あぁそうですか。どうでもいいですが。
とりあえずカレンダー的にはこれで祝日も一応は網羅したっぽいんでこれでとりあえず運用してみますか?またPHPで記述したスクリプトのファイルサイズが
巨大化したけどな(汗)あんまり巨大化しすぎるとメンテナンス性能(可読性、どこがおかしいのかすぐに分かる。変数が衝突する事が少ない)が落ちるんで。

まぁいいや。とりあえず2014年12月までの出力内容を一通り眺めてみた訳だが変な出力でテーブルの整形が崩れたり、同じ日付なのに赤色と緑色の
休日扱いと平日扱いが並んで出力されているみたいな事も無いんで。一応は2014年12月までは実用可能と言う事でいいんじゃないですか?みたいな状態なんで。
カレンダーを作るのに大体2000バイト程度か。以前が1100バイト程度だった事を考えればおよそ2倍程度のファイルバイトサイズになっていたりもする。

2010年10月29日(金)07時19分55秒