2010年10月26日(火)円舞中

何月何週の何曜日を入力する事で今年、去年、2年前。それぞれの「何月何週の何曜日」にとまむさんが書いた日記を3年分ぐらい一気に表示可能なスクリプト。
そう言うスクリプトを書いていた事は既に日記で書いていた訳だがその日付を求めるのに必要な記述がどの様にして動いているのか。それを書いていなかった。
それを書いても俺本人にしか役に立たないが、こう言う風に書く事で実現しておりますと言うのを見ればスクリプトの修正や発展にも役に立ってくる。それが書く理由。

減算の形でwhileを掛ける。その中でもう1つ、入れ子の状態でwhileを、checkdateを使いながら掛ける。指定した内容の内「何月」をまずは当てはめる。
「何年(つまり今年、去年、2年前)」の内容は既にdate関数で採取してあるので「今年」をまずは入れ、その数字から1を引いていく事になる。今年だったら
2010を変数に収納してそれを当てはめ、その変数を「ハイフンを2つ後ろにくっつける」事でマイナス1ずつ引いていく。去年だったら「2010−1=2009」となる。

例えば「10月4週の日曜日」と入力した場合、まずは入力した「10月」を当てはめて、「今年の10月1日」の曜日をmktimeで算出する。checkdateを掛けながら
whileでループを掛ける。今年の10月1日の曜日、今年の10月2日の曜日…とcheckdateを使って今年の10月31日の曜日までを、ループを掛けながら算出する。

この場合、「日曜日」なので、dateの数字は「0」が入る。「今年の10月1日から今年の10月31日までのそれぞれの曜日」をcheckdateでループし、mktimeで算出した
その中から「今年の10月の日曜日、つまりdateの数字に0が入る所」がまずは条件に当てはまる。「今年の10月なんとか日は日曜日」がまずは対象となる。

それが「if(分岐条件)」の1つ目。分岐条件で使う内容は3つある。その内の1つ目が「入力した曜日と算出した曜日が一致しているかどうか」を見る。

2つ目の条件は「入力した週」を見る。この場合には「4週」が当てはまる。曜日は1週間に1度、つまり日曜日から土曜日まで7日間でローテーションを回している。
そこで「7」と言う数字を使う。「入力した週×7」その数字を基準とする。「4週」なので「4×7=28」が入る。これが2つ目の条件。3つ目の条件もこの仲間に入る。

3つ目の条件は「入力した週の数字から1を引く」この場合には「4−1=3(週)」が当てはまる。「3週」なので「3×7=21」が入る。これが3つ目の条件。

以上3つの条件を当てはめて、その全てに当てはまる数字を出力する。あとは「西暦の数字と入力した月、この場合には「10月」を当てはめて3年分のそれを求める。
「2010年10月」「2009年10月」「2008年10月」の以上3つ。3つそれぞれの10月の中でcheckdateを使ってif(分岐条件)に当てはまる日付を出力する。

入力した曜日:日(曜日) 分岐条件(1つ目)「date関数で日曜日は『0』、checkdateで調査した今年から2年前のそれぞれの10月で0になる条件(日曜日)を算出する」
入力した週間:4(週目) 分岐条件(2つ目)「1週間は7日。4(週)×7(日間)=28。28と言う数字を『含めて』、小さい数字が曜日の数字の条件になる」
入力した週間:4(週目) 分岐条件(3つ目)「週を1週引く。4−1=3。3(週)×7(日間)=21。21と言う数字を『含めて』、大きい数字が曜日の数字の条件になる」

つまり「4週」と入力した時点で「21、22、23、24、25、26、27、28」の中に、目的とする「日曜日」が含まれている事になる。入力した「10月」の曜日を
checkdateを使い、今年、去年、2年前のそれぞれの10月をループしながら算出する。date関数の中から「w」を使い、それぞれの年の10月1日から10月31日までを
ループしながら「w」を使って曜日を算出し、この場合には「日曜日」と入力しているので「日曜日は0」よって「w」を使って算出した結果が「0」になる日付を出力する。

「21日から28日までの間に目的とする第4週の日曜日がある」「2010年だったら2010年10月21日から2010年10月28日までの間に目的とする曜日がある」
「2010年10月21日は何曜日ですか?→木曜日です」「2010年10月22日は何曜日ですか?→金曜日です」以降「2010年10月28日まで」を同様に算出する。

2010年の場合には「2010年10月24日」が「(2010年10月の)第4日曜日」なので、出力するのは「2010年10月24日の日記」となる。それが「今年」の分。

あとは最初に書いた通り「減算しながら最初のwhileが掛かっている」ので「今年の分」を求めたら「去年の分」、「去年の分」を求めたら「2年前の分」を
上記と同じ考え方を使って、入れ子にしたcheckdateを掛けながらの2つ目のループを使って算出した内容を分岐条件に掛けて当てはまる内容を出力していく。

「(2009年10月の)第4日曜日 → 2009年10月25日」 「(2008年10月の)第4日曜日 → 2008年10月26日」 いずれも「21日から28日まで」の間。

「2010年10月24日の日記」「2009年10月25日の日記」「2008年10月26日の日記」を出力する事で、今年を含めて今年からこれまでの3年分の
「何月何週の何曜日にとまむさんが書いた日記」が出力される。と言う流れになる。検索ワードを入れなければ条件に当てはまる日記が全部出力される。
検索ワードを入れればそのワードが含まれている日記だけを出力する。それは「お好みで」と言う事で入力必須の内容にはしていない。そう言うやり方で出力している。

2010年10月26日(火)08時00分03秒