PHPでカレンダー作りのおさらい

2019年6月22日

phpでカレンダー作りした時のおさらいをします。

大まかな流れ

  1. イメージを浮かべる
  2. phpで定義
  3. HTMLでフォームの型を作る
  4. phpで内部のプログラミング
  5. CSSで装飾

イメージ図

calendar

作る順序

まずイメージ図からどんな要素が必要かを洗い出します。

  1. 1月、2月、3月…の月をループで出力
  2. 月ごとのテーブルを作成
    • ○月の部分のキャプション
    • 月火水木金土日の定型的で共通の部分のコーディングなど
  3. 1〜31の月ごとの日にちの出力のために
    • 月初めと月末の日を取得
    • 初日の曜日を取得し1日の曜日まで空のテーブルを用意
    • 1-31のテーブル(td)の出力と週ごとにテーブルの終了を記載
    • ループを繰り返す

大事なポイント

どれも抜けてはいけませんが、

イメージをし、まず言葉で定義していくこと
使いまわせる部分はどこかを探すこと
1月の12回繰り返しであるということ
時間や日付に関する関数を理解すること

自分の言葉でどんなプログラミングにするべきなのかを言えないと、それはつまりプログラミングをどのように書けばいいのかがわかっていないことと同義なので、まずはここがとても大事です。

コード(CSSは除く)

<?php 
// カレンダーを表示する「年」を指定
$year = 2019; 
// 年始のタイムスタンプを取得 
$timestamp = strtotime("{$year}-01-01 00:00:00"); 
$weekday = 0; ?> 
<!DOCTYPE html> 
<html lang="ja">
<head>
    <meta charset="utf-8">
    <title>カレンダーの作成</title> 
</head> 
<body> 
<main> 
<?php 
    // 1月〜12月までのループ 
    // endforまで
    for( $i=1; $i<=12; $i++): ?> 
    <!--○月のキャプションと曜日 -->
    <table> 
    <caption>
        <?php echo $i; ?>月</caption> 
    <thead> 
        <tr> 
        <th>日</th><th>月</th><th>火</th><th>水</th><th>木</th><th>金</th><th>土</th> </tr> 
    </thead> 
    <tbody> 
        <?php 
        // 月の初めの日を取得 
        $start_day_timestamp = mktime(0,0,0,$i,1,$year); 
        // 月末日を5つ目の,0で取得 
        $end_day_timestamp = mktime(0,0,0,($i+1),0,$year); 
        //取得したタイムスタンプをdate関数で日にちに変換 
        $end_day = date("d", $end_day_timestamp); 
        //1日〜31日までの出力スタート(ループ) 
        for( $j=1; $j <= $end_day; $j++ ) { 
        //1日の曜日を取得と空のテーブルを用意 
            if( $j === 1 ) { 
            //初めにテーブル(table row)を用意
            echo '<tr>'; 
            //$weekdayに月初の日を設定 
            $weekday = date("w", $start_day_timestamp); 
        //週ごとのテーブル(table data)をループで作る 
            for( $k=0; $k<$weekday; $k++ ) {
            echo '<td></td>'; 
            } 
        } 
    //上記のループの外で1~31まで出力(table dataに入れる)と$weekdayを1進める
    echo '<td>'.$j.'</td>'; 
    $weekday++; 
    //もし$weekdayが6(つまり土)まで来たらテーブル(table row)を閉じ$weedayを0に戻す
    if( 6 < $weekday ) { 
        echo '</tr><tr>'; $weekday = 0; 
        } 
    } 

    ?> 
    </tbody> 
    </table> 
    <!--//上に戻る(これで1月分の1~31日が出力される) -->
    <?php endfor; ?>
</main> 
</body> 
</html>

 

以上となります。