このサイトはPHPを独習する際に作成したスクリプトを基に、プログラム言語初心者のための入門講座として作成しました。PHPは初心者に親しみやすく、解りやすいプログラム言語です。これからプログラムを学ぶ人の参考になればと思います。
11-1 checkdateでカレンダー
プログラミング練習の定番はカレンダーですよね。カレンダーを作るには色々な方法があるようですが、ここでは checkdate 関数を使って作成します。checkdate はその日が存在するかどうかをチェックする関数なのです。 例えば checkdate( 2, 29, 1985 ) と記述することで1985年2月29日が存在するかどうかがわかります。この関数をそのまま実行すると、何も表示されません。2月29日が存在しないからです。これを28日にすると1が表示されます。これがtrueを返すと言うことなんですねぇ。
for($day = 1; checkdate(2, $day, 1985); $day++ ){ echo $day; }
これは$day が1から始まり順に増えていく、そしてそれが存在すれば $day を表示する。29になりそれが存在しなければループを抜け出すという命令です。これを使えば、指定した年月の日付を順にすべて表示させることができるのです。この場合は1から28までを表示するのです。
カレンダーには日曜から始まり、土曜日で改行させてテーブルを作っていく仕組みが必要です。これは前のループでやりました。しかしその月が何曜日から始まるか、最後の日付からの空欄をどうするかもちょっとした問題です。
先ず指定年月の1日の曜日を数値で手に入れます。それが木曜日なら4です。と言うことは最初の空欄は4つ、ここでは for を使って4回”・”を表示させています。その後に checkdate でカレンダーの表示を開始するのです。
$wtop = date(w,mktime(0,0,0,2,1,1985)) ; for($k = 0 ; $k < $wtop ; $k++){ echo "<td align='center'>・</td>n"; }
もう一つ、年月を指定するために<form>を使うのですが、<select>は1971年から2038年までを<option>で表示しなければなりません。これをHTMLで書くと、もうウンザリです。 ところが!PHPはいつでもどこでも使えるので、<select>の中にぶちこんでみました。こうやると68この<option>があっという間に作成できます!すごい! while 命令で1970に1を足しながら2038まで繰り返します。それを echo 命令で順に表示させているのですね。サンプルでは今の年月を最初に表示させるためにもう一工夫しています。
<select name="year"> <?php $cnt = 1970; while ($cnt < 2038){ echo "<option value='$cnt'>$cnt</option>"; $cnt++; } ?> </select>
このfileから <form> の action の指定を次のように変更しています。
<form method="post" action="<?php echo $_SERVER["PHP_SELF"]; ?>">
これまで、action の指定を自ファイルの名称としていましたが、これはけっこう面倒なんです。ファイルをコピーして多少の変更を加えた時なんか、ここの変更を忘れて「動かねー!」なんてことがよくありました。しつこいですが PHP はどこでも使えるのでここにも入れてあげましょう。$_SERVER["PHP_SELF"]は定義済の変数で「現在実行しているスクリプトのファイル名」という意味です。
⇒こんな感じ
11-2 カレンダーをもう一工夫
今日の日付と過去の日付が解りやすいように、ちょっと一工夫しましょう。mktimeを使って今日のタイムスタンプとカレンダーで順に記述される日付を比較して表示方法を変えていくだけです。
for(1日から終わりまで繰り返す){ $todaystamp = mktime(今日の0時のタイムスタンプ); $daystamp = mktime(カレンダーのタイムスタンプ);
if(日曜日の場合){ if 今日の場合--背景を変える else if 過去の場合--背景を変える else 未来の場合 } else if(土曜日の場合) if 今日の場合--背景を変える else if 過去の場合--背景を変える else 未来の場合 } else {平日の場合 if 今日の場合--背景を変える else if 過去の場合--背景を変える else 未来の場合 } }
スタイルシートを使うことでスクリプトがかなりすっきりしました。
⇒こんな感じ
11-3 カレンダーをサイトに取り込む
カレンダーをサイトの一部に表示させることは、ブログでは欠かせませんね。もちろんスクリプトの一部分に書き加えればそれで表示可能なのですが、ここではこのカレンダーを別ファイルにし、ユーザー定義関数として書いたものを取り込んでみましょう。 ここで登場するのが require("ファイル名") です。取りこむファイルの中にはカレンダー表示のスクリプトが関数として書かれています。こうすると、カレンダーを表示させる部分は非常に簡潔になります。
<?php require("11_03_date_b.php"); ?> ←ここがPHP <html><head><title>カレンダーを表示する</title></head> <body> <div class="file2"> <?php cal();?> ←ここがPHP </div> </body></html>
スクリプトはカレンダーをシンプルにして、関数にしたファイルです。
⇒こんな感じ
11-4 1970年以前のカレンダー
これまでのカレンダーは1970年〜2038年までの対応でしたが、もっと広範囲のカレンダーの作成です。これまでに使用した checkdate と timestamp は1970年〜2038年にしか対応していないので、この関数は使用できません。 変わりに使用する関数が cal_days_in_month / cal_to_jd / jddayofweek の3つです。カレンダーを作成するのに必要なデータはその月が何日あるのか、そしてその月が何曜日から始まるのか、という2点だけです。 ここでユリウス積算日という聞きなれない言葉が出てきます。これは紀元前4713年をスタートとして数えられる日数です。この日数が解ればそれを元に曜日を返すのですから、なんだかすごいですね。 CAL_GREGORIAN と言うのはグレゴリウス暦と言うのですが、歴史的にさまざまな暦の形式があり、グレゴリウス暦は現在使われている暦であるわけです。PHP ではこれ以外にフランス革命暦やユダヤ暦など13種にも及ぶ暦があります。通常は必要ないでしょうが、歴史の研究などにはかなり役立ちそうですね。
cal_days_in_month(暦,月,年) その月が何日まであるか cal_to_jd(暦, 月,日, 年) ある日付がユリウス積算日の何日目か jddayofweek(ユリウス積算日,表示形式) ユリウス積算日が何曜日になるか
実際のスクリプトはこんな感じ、曜日の表示形式は、0が数字、1が英語、2が英語短縮形です。
$days = cal_days_in_month (CAL_GREGORIAN, $month, $year); $week = jddayofweek (cal_to_jd(CAL_GREGORIAN, $month,1, $year),0);
これで、紀元前4713年以降、西暦100兆年頃!!までのカレンダーが表示できます。
⇒こんな感じ |