PHPでカレンダー出力プログラムを解説【プログラミング初心者の入門講座】

2020年3月2日システムPHP,プログラムコード,プログラム入門

【初心者】PHPでカレンダー出力のプログラミングを解説【プログラミング初心者の入門講座】
【初心者】PHPでカレンダー出力のプログラミングを解説【プログラミング初心者の入門講座】

どうも、UT(@ut_1029)です。

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();
UNIXタイムスタンプとは

コンピュータシステム上での時刻表現の一種です。
協定世界時(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を指定する理由

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から自分で同じようなカレンダー出力プログラムを実装してみてください!
(写経だと自分の力になりにくいので)

他にも「土日の色分け」「前月や翌月を表示機能」などカスタマイズすると理解が深まるのでおススメです。

最後まで読んでもらいありがとうございます。

【初心者】PHPでカレンダー出力のプログラミングを解説

UT
UTの日常
UTの日常

1985年生まれ1児の父親です。ブログとか副業で収入を得る手段を模索中であります。(無理しない程度が理想wだから実績が出ないorz)
UTのプロフィール
Amazon欲しいものリスト

2020年3月2日システムPHP,プログラムコード,プログラム入門

Posted by UT