phpな休日 BBS sitemap
1. 今月の1日から31日までを表示

[1. 表示する] の時に触れましたが date関数で今日の "年" と "月" を取得します。

$nen = date("Y"); //今日の"年"
$gatsu = date("n"); //今日の"月"

今月の1日から31日までを改行しながら表示するには

$nen = date("Y"); //今日の"年"
$gatsu = date("n"); //今日の"月"
$hi = 0; //"日"は 0 から始める

for ($i = $hi; $i < 31; $i++) { //$hi が31になるまで繰り返す
$hi++; //"日" を足す
print $nen . "/" . $gatsu . "/" . $hi . "<br>¥n"; //表示する
}

実行
2. checkdate関数で日付のチェック

月により30日、28日、閏年は29日と、1ヶ月の日数に違いがありますので、処理は31日まで繰り返すように書いて、表示の前に checkdate関数でその日付が有効なものであるかをチェックします。
書式は checkdate(月, 日, 年) と書きますので、変数をあてはめると

checkdate($gatsu, $hi, $nen)

こうなります。
チェックしてもしも無効な日付だった場合は break で繰り返し処理を抜けるようにすれば、30日で終わる月は表示も30日までで止まります。
checkdateでチェックした結果は flase か true で返されます。true が真、flase が偽。あるいは true が成立、flase は不成立。または true が YES、flase は NO の意味です。
以下のような処理をします。checkdate に働いてもらうために、繰り返しは40回行うように書いてあります。(checkdate が止めてくれます。)

$nen = date("Y"); //今日の"年"
$gatsu = date("n"); //今日の"月"
$hi = 1;//"日"は 1 から始める
for ($i = $hi; $i < 40; $i++) { //40まで繰り返す
print $nen . "/" . $gatsu . "/" . $hi . "<br>¥n";
$hi++;
if (checkdate($gatsu, $hi, $nen) == false) { //ありえない日付だったら
break; //繰り返し処理を抜ける
}
}

実行
3. mktime関数で曜日を取得

これも [1. 表示する] の時に触れましたが、今日の曜日を取得するのは

date("w");

とすることで曜日に対応する数値(0~6が日~土に対応します)が取得できるのですが、それでは指定した日の曜日を取得するにはどうしたら良いでしょう。
mktime関数を使います。書式は

mktime(時, 分, 秒, 月, 日, 年)

です。それでは今月の日付に曜日をつけて表示してみます。

$youbi = array("日","月","火","水","木","金","土"); //曜日を配列に入れる
$nen = date("Y"); //今日の"年"
$gatsu = date("n"); //今日の"月"
$hi = 1; //"日"は 1 から始める
for ($i = $hi; $i < 40; $i++) { //繰り返し
$you = date("w", mktime(0, 0, 0, $gatsu, $hi, $nen)); //曜日を取得
print $nen . "/" . $gatsu . "/" . $hi . " " . $youbi[$you] . "<br>¥n"; //表示
$hi++; //日付+1
if (checkdate($gatsu, $hi, $nen) == false) { //+1した日付がありえない日付だったら
break; //繰り返し処理を抜ける
}
}

実行
4. カレンダーっぽい表組み

カレンダーらしくテーブルに入れて表示してみましょう。例えば以下のような表示。

        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  

上の表は2006年6月の表を HTML タグで書いたものですが、PHP で書かせようとすると1日が表の左上から始まらないことに気づきます。
その月の1日の曜日を求めて、それ以前に空のセル(TD)を出力するようにします。

<?php
$youbi = array("日","月","火","水","木","金","土"); //曜日を配列に入れる
$nen = date("Y"); //今日の"年"
$gatsu = date("n"); //今日の"月"
$hi = 1; //"日"は 1 から始める
$you = date("w", mktime(0, 0, 0, $gatsu, $hi, $nen)); //1日の曜日
?>
<table border="1">
<tr>
<?php
if ($hi == 1) { //1日だったら
$yo = 0; //初期値を 0 として変数 $yo を設定
for ($i = $yo; $i < $you; $i++) { //1日の正しい曜日まで繰り返す
print "<td>&nbsp;</td>¥n"; //空白セルを出力
}
}
print "<td>" . $hi . "</td>";
?>
</tr>
</table>

実行

続けて月末まで一気に表示します。

for ($i = $hi; $i < 40; $i++) { //日付に1を足しながら40日まで繰り返し
print "<td>" . $hi . "</td>¥n"; //表示する
$hi++;
if (checkdate($gatsu, $hi, $nen) == false) { //+1した日付がありえない日付だったら
break; //繰り返し処理を抜ける
}
}

実行

1列7日表示の表にした場合、月末日の後ろに空セルを表示させます。

$hi = $hi -1; //行き過ぎた日を1日戻す
$you = date("w", mktime(0, 0, 0, $gatsu, $hi, $nen)); //月末日の曜日取得
if ($you < 6) {
$yo = $you;
for ($yo; $yo < 6; $yo++) { //カレンダー1列分(6)まで繰り返す
print "<td>&nbsp;</td>"; //空白セルを出力
}
}

実行

日付の繰り返し表示処理中に土曜日($you == 6)になったら TR で行変えします。

if ($you == 6) { //土曜日なら
print "</tr>¥n<tr>¥n"; //行変えする
}

実行
5. セルに色をつける

土曜日と日曜日、それから今日のセルに色をつけてみます。

for ($i = $hi; $i < 40; $i++) { //日付に1を足しながら40日まで繰り返し
$you = date("w", mktime(0, 0, 0, $gatsu, $hi, $nen)); //曜日
if (($nen == date("Y")) && ($gatsu == date("n")) && ($hi == date("d"))) { //今日なら
print "<td align='center' bgcolor='#8fbc8f'>" . $hi . "</td>¥n"; //背景を darkseagreen に
}
elseif ($you == 0) { //日曜日なら
print "<td align='center' bgcolor='#ffc0cb'>" . $hi . "</td>¥n"; //背景を pink に
}
elseif ($you == 6) { //土曜日なら
print "<td align='center' bgcolor='#b0c4de'>" . $hi . "</td>¥n"; //背景を lightsteelblue に
}
else {
print "<td align='center'>" . $hi . "</td>¥n"; //その他平日表示
}

実行

祝日を赤くしないとカレンダーになりませんね。続きは次回。


中途半端ですがページも長くなりましたので、バラバラのスクリプトを見てもピンとこない、動かしてみないとわからないという方 こちら からzip形式をダウンロードできるようにしました。


Fatal error: Uncaught Error: Undefined constant "Y.n.j" in /home/users/2/secret.jp-final/web/phpholiday/21/index.cgi:262 Stack trace: #0 /home/users/2/secret.jp-final/web/phpholiday/index.php(334): include() #1 {main} thrown in /home/users/2/secret.jp-final/web/phpholiday/21/index.cgi on line 262