PHPでカレンダー出力プログラムを解説【JavaScript基礎講座】

PHPでカレンダーを出力するプログラミング解説です。
この記事を書いている僕は、プログラミング歴10年以上のプログラマーです。
詳細:プログラミング未経験の新卒が10年間プログラマーとして仕事して思うこと
PHPでカレンダー出力プログラムを解説
PHPでカレンダーを出力するプログラミングを解説します。

カレンダー出力はループ処理の基礎を学ぶことができます。
カレンダー出力で習得できること
カレンダー出力は、ループ処理の習得に最適なプログラミングの練習問題です。
- ループの制御
- ループ内で処理の実行
ぜひチャレンジしてください!
サンプルコード
では、さっそくPHPでカレンダー出力するサンプルコードから紹介します。
(基本的にコピペで動くと思います。)
<?php
$weeks = [
0=>'日',
1=>'月',
2=>'火',
3=>'水',
4=>'木',
5=>'金',
6=>'土',
];
$today = time();
$start = date('Ym01', $today);
$end = date('Ymt', $today);
$days = [];
$len = 0;
for ($day=$start; $day<=$end; $day++) {
$w = date('w', strtotime($day));
if ($w == 0) {
$len++;
}
if (!isset($days[$len])) {
foreach ($weeks as $key_week=>$val_week) {
$days[$len][$key_week] = '';
}
}
$days[$len][$w] = $day;
}
?>
<html>
<head>
<title>PHPでカレンダー</title>
<meta charset="UTF-8">
</head>
<body>
<h1>PHPでカレンダーを作成</h1>
<div>
<?php echo date('Y年n月', $today) ?>
</div>
<table>
<thead>
<tr>
<?php foreach ($weeks as $key_week=>$val_week) : ?>
<th><?php echo $val_week ?></th>
<?php endforeach; ?>
</tr>
</thead>
<tbody>
<?php foreach ($days as $day) : ?>
<tr>
<?php foreach ($weeks as $key_week=>$val_week) : ?>
<?php
$style = '';
if ($key_week == 0) {
$style = 'color: red;';
}
elseif ($key_week == 6) {
$style = 'color: blue;';
}
?>
<?php if ($day[$key_week]) : ?>
<td style="text-align: right;<?php echo $style ?>"><?php echo date('j', strtotime($day[$key_week])) ?></td>
<?php else : ?>
<td></td>
<?php endif; ?>
<?php endforeach; ?>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</body>
</html>
- pickles様より頂いたご指摘をフィックス
カレンダー出力の準備部分を解説
PHPでカレンダー出力するサンプルコードのカレンダー出力するための準備部分から解説します。
曜日の名称を配列で用意
曜日を出力する際に使用する曜日名称を配列で用意します。

PHPのdate関数「"date('w’)"」では曜日が数字で表されます。
$weeks = [
0=>'日',
1=>'月',
2=>'火',
3=>'水',
4=>'木',
5=>'金',
6=>'土',
];
現在日時を取得
PHPのtime関数で現在日時をUNIXタイムスタンプで取得します。
$today = time();
コンピュータシステム上での時刻表現の一種です。
協定世界時(UTC)の1970年1月1日 00時00分00秒から経過した時間(秒数)を表す時刻表現を指します。
現在日時から今月の月初と月末を取得
取得した現在日時から今月の月初と月末の日付をdate関数で取得します。
$start = date('Ym01', $today);
$end = date('Ymt', $today);
- $start = date('Ym01’, $today);
- 現在日時から月初の年月日を取得
- $end = date('Ymt’, $today);
- 現在日時から現在の月末日を取得
カレンダー出力用の配列を作成
カレンダーを出力するための配列を作成します。
$days = [];
$len = 0;
for ($day=$start; $day<=$end; $day++) {
$w = date('w', strtotime($day));
if ($w == 0) {
$len++;
}
if (!isset($days[$len])) {
foreach ($weeks as $key_week=>$val_week) {
$days[$len][$key_week] = '';
}
}
$days[$len][$w] = $day;
}

少し処理が長いので1つ1つ細かく解説していきます。
変数と配列を用意
カレンダー出力用の配列とfor文で使用するための変数を宣言しておきます。
$days = [];
$len = 0;
- $days = [];
- カレンダー出力用の配列
- $len = 0;
- カレンダーの行数(週の数)
for文で月初から月末までループ
次にfor文を月初から月末までループさせます。ループで日付を1日ずつ加算して変数の$dayへセットするようにします。
for ($day=$start; $day<=$end; $day++) {
}
- $day=$start;
- $dayの初期値として1日をセット、$dayは日にちを代入
- $day<=$end;
- 月初から月末までループ
- $day++
- 日にちをインクリメント(1ずつ加算)
曜日を取得
$dayに代入される日付の曜日を取得します。
$w = date('w', strtotime($day));
日曜日の時にカレンダーの行数を1行加算
$wに代入した曜日が日曜日のときに行を1行加算するようにします。
if ($w == 0) {
$len++;
}
日曜から土曜までの7日分を配列へ追加
カレンダーの行数を1行追加した時や初回ループ時などの時に日曜から土曜までの7日分を配列へ追加しておきます。
if (!isset($days[$len])) {
foreach ($weeks as $key_week=>$val_week) {
$days[$len][$key_week] = '';
}
}
日付を配列へ追加
最後に配列へ日付を追加します。
$days[$len][$w] = $day;
カレンダー出力部分を解説
PHPでカレンダー出力するサンプルコードのカレンダー出力部分を解説します。

$days配列へ格納したカレンダーのデータを使ってHTMLを出力していきます。
文字コードを指定
HTMLのheadタグ内にmetaタグでcharset(文字コード)をUTF-8に指定します。
<meta charset="UTF-8">
metaタグでcharset(文字コード)を指定しないとWebページが文字化けする原因となります。
カレンダーの年月を出力
カレンダーの年月を出力します。日付のフォーマットを「yyyy年mm月(2020年3月)」となるように"Y年n月"とします。
<div>
<?php echo date('Y年n月', $today) ?>
</div>
カレンダー出力:テーブルの見出しに曜日を出力
テーブルの見出しとなるtheadタグへtrタグとthタグで日曜から土曜までの曜日を出力します。
<thead>
<tr>
<?php foreach ($weeks as $key_week=>$val_week) : ?>
<th><?php echo $val_week ?></th>
<?php endforeach; ?>
</tr>
</thead>
カレンダー出力:日付を出力
カレンダーの日付をforeach文を使って出力していきます。
<tbody>
<?php foreach ($days as $day) : ?>
<tr>
<?php foreach ($weeks as $key_week=>$val_week) : ?>
<?php
$style = '';
if ($key_week == 0) {
$style = 'color: red;';
}
elseif ($key_week == 6) {
$style = 'color: blue;';
}
?>
<?php if ($day[$key_week]) : ?>
<td style="text-align: right;<?php echo $style ?>"><?php echo date('j', strtotime($day[$key_week])) ?></td>
<?php else : ?>
<td></td>
<?php endif; ?>
<?php endforeach; ?>
</tr>
<?php endforeach; ?>
</tbody>

少し処理が長いので1つ1つ細かく解説していきます。
ループでカレンダーの行を出力
カレンダー出力用の配列$daysを使ってforeach文でループします。
<?php foreach ($days as $day) : ?>
<tr>
</tr>
<?php endforeach; ?>
ループで日付を出力
次に日曜から土曜までを$weeksを使ってforeach文でループします。
<?php foreach ($weeks as $key_week=>$val_week) : ?>
<?php endforeach; ?>
日曜と土曜だけ文字色を変更
日曜日と土曜日だけ文字の色を変更するようスタイル調整します。
$style = '';
if ($key_week == 0) {
$style = 'color: red;';
}
elseif ($key_week == 6) {
$style = 'color: blue;';
}
日付を出力
日付がセットされていたら日付を出力するようにします。
<?php if ($day[$key_week]) : ?>
<td style="text-align: right;<?php echo $style ?>"><?php echo date('j', strtotime($day[$key_week])) ?></td>
<?php else : ?>
<td></td>
<?php endif; ?>
まとめ:PHPでカレンダー出力プログラムを解説
今回はPHPでカレンダーを出力するプログラムのサンプルコードを解説しました。

カレンダー出力プログラムは、ループ処理の習得に最適なプログラミングの練習問題でした。
- forでループしながら行う処理をしっかりとイメージ
カレンダー出力プログラムを終えた人へ
0から自分で同じようなカレンダー出力プログラムを実装してみてください!
(写経だと自分の力になりにくいので)
他にも「土日の色分け」「前月や翌月を表示機能」などカスタマイズすると理解が深まるのでおススメです。
最後まで読んでもらいありがとうございます。
ディスカッション
コメント一覧
$todayは文字列の日付を持つのではなく、Unixtimeで持てば毎回strtotime()を噛ます必要はないです。
ループの謎の初期化も不要だったので消しました。
誰かにコードレビューしてもらったほうがいいと思います。
<?php
$weeks = [
'日',
'月',
'火',
'水',
'木',
'金',
'土',
];
$today = microtime(true);
$start = date('Ym01', $today);
$end = date('Ymt', $today);
$days = [];
$len = 0;
for ($day = $start; $day
後略(このあと$today呼び出す箇所のstrtotime()も不要)
pickles様
ご指摘ありがとうございました。
ご指摘のようにdate関数で日付を文字列型で持つより、
unixtimeで$todayを持つことでstrtotimeで変換する処理は不要となります。
ご指摘の内容を記事へ反映させて頂きます。