※この記事は「2021年4月20日」に更新しました。
前回は、正規表現について紹介しました。
JavaScript でタイピングゲームを作成したので、PHP ではカレンダーを作成したいと思います。
単純なものでも、組み合わせていくと色々なものをつくれるようになると思うので、コツコツやっていきたいと思います。
今回もドットインストールと参考書を見ながら、勉強しています。
ドットインストールに関しては、プレミアム会員になれば、動画見放題です。

カレンダーを作成する
それでは、カレンダーを作成していきます。
今回の記事のポイントは、以下の通りです。
- HTML と CSS を用意する
- 当月のカレンダーを表示させる
それでは、見ていきましょう。
HTML と CSS を用意する
カレンダーの全てが動的表示というわけではありません。
ベースとなる HTML と CSS を用意していきます。
まずは、HTML のコードを紹介します。
ちなみに PHP を埋め込む予定なので、ファイルの拡張子は .php になります。
<?php
/* この部分はあとで埋め込みます。 */
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>My Calendar</title>
<link rel="stylesheet" href="css/style.css">
</head>
<body>
<table>
<thead>
<tr>
<th><a href="">«</a></th>
<th colspan="5">October 2019</th>
<th><a href="">»</a></th>
</tr>
</thead>
<tbody>
<tr>
<td>Sun</td>
<td>Mon</td>
<td>Tue</td>
<td>Wed</td>
<td>Thu</td>
<td>Fri</td>
<td>Sat</td>
</tr>
<tr>
<td class="week_0">1</td>
<td class="week_1">2</td>
<td class="week_2">3</td>
<td class="week_3">4</td>
<td class="week_4 today">5</td>
<td class="week_5">6</td>
<td class="week_6">7</td>
</tr>
<tr>
<td class="week_0">30</td>
<td class="week_1">31</td>
<td class="except">1</td>
<td class="except">2</td>
<td class="except">3</td>
<td class="except">4</td>
<td class="except">5</td>
</tr>
</tbody>
<tfoot>
<tr>
<th colspan="7"><a href="">Today</a></th>
</tr>
</tfoot>
</table>
</body>
この HTML を見てもらうとわかるかと思いますが、曜日ごとにスタイルを分けるためにクラスを作成しているのと、今日は何日なのかということがわかるように today というクラスを作成しています。
あとは、翌月表示分もスタイルを分けるために except というクラスを作成しています。
スタイルシートは、以下の通りです。
body {
font-family: Arial, sans-serif;
font-size: 1em;
}
a {
text-decoration: none;
}
table {
margin: 15px auto;
border: 1px solid #dddddd;
border-collapse: collapse;
}
th {
background: #eeeeee;
}
th, td {
padding: 7px;
text-align: center;
}
.week_0 {
color: red;
}
.week_6 {
color: blue;
}
.today {
font-weight: bold;
}
.except {
color: #dedede;
}
以下のような表示になります。
これから、この HTML を改良していきます。
当月のカレンダーを表示させる
それでは、肝心の PHP で当月のカレンダーを表示させる部分をつくっていきます。
DatePeriod というクラスを使っていきます。
今回の使い方は、以下の通り。
$daterange = new DatePeriod(期間の開始日, 期間内での発生間隔, 期間の終了日);
では、実際にソースコードを紹介します(PHP)。
<?php
$content = '';
$daterange = new DatePeriod(
new DateTime('first day of this month'),
new DateInterval('P1D'),
new DateTime('first day of next month')
);
foreach ($daterange as $day) {
if ($day->format('w') % 7 === 0) {
$content .= '</tr><tr>';
}
$content .= sprintf('<td class="week_%d">%d</td>', $day->format('w'), $day->format('d'));
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>My Calendar</title>
<link rel="stylesheet" href="css/style.css">
</head>
<body>
<table>
<thead>
<tr>
<th><a href="">«</a></th>
<th colspan="5">October 2019</th>
<th><a href="">»</a></th>
</tr>
</thead>
<tbody>
<tr>
<td>Sun</td>
<td>Mon</td>
<td>Tue</td>
<td>Wed</td>
<td>Thu</td>
<td>Fri</td>
<td>Sat</td>
</tr>
<tr>
<?php echo $content; ?>
</tr>
</tbody>
<tfoot>
<tr>
<th colspan="7"><a href="">Today</a></th>
</tr>
</tfoot>
</table>
</body>
foreach で表示させている部分に関しては、公式の PHPマニュアル(DatePeriod)に似たような書き方があるので、興味のある方は参考にどうぞ。
結果は以下の通りです。
しかし、この段階だとまだ開始位置がおかしいので、1行目のカレンダー表示がおかしくなっています。
次回、修正していきたいと思います。
最後に
いかがでしょうか。
次回は、翌月部分や前月部分についてもつくっていきたいと思います。

