LABO IWASAKI

PHPでカレンダー

Make Calendar

PHPでカレンダーを作ります。
Tableを使って表示し、そのCSSも置いてます。
デモも用意しているのでご覧ください。

日付はforで回してmktimeで曜日取得。
カレンダーにするため空セルを使って
表示を整えているのがポイントです。

カレンダーのPHP部分

Calendar Code

$_SESSION['year'] = date("Y");
$_SESSION['month'] = date("m");
$year = $_SESSION['year'];
$month = $_SESSION['month'];

$start_week = date("N", mktime(0, 0, 0,$month,1,$year));//mktimeで曜日を取得 

if ($start_week != 1){//月曜始まりでなければ空セル挿入
   for($i=2 ; $i<=$start_week ; $i++){
   echo '<td class="no-day"> </td>';
   $fold++;
  }
}

for ($day = 1; checkdate($month, $day, $year); $day++ ){//checkdate関数で
 echo '<td class="day">'.$day.'</td>';//日付が存在しなくなるまでforで回す
   $fold++;
      if ($fold ==7){
      echo "</tr><tr>";//<tr>挿入で折り返し
      $fold =0;//折り返しカウンタリセット
  }
}

if ($fold!=0){//日曜終りでなければ空セル挿入
    while ($fold<7){
    echo '<td class="no-day"> </td>';
    $fold++; 
  } 
}

mktimeで曜日を取得し、カレンダーの表示形式になるように空セルを使って整えています。
1日が月曜日じゃない場合は、10行目と26行目のように空セルを挿入しています。
16行目は日付が入っている部分です。
11行目、17行目、27行目の「$fold」で一行が一週間(セル7個)になるように調整しています。
※…「fold」は「折り返す」という意味

▶︎カレンダーDEMO

カレンダーのHTML部分

Calendar HTML

<table class="calendar">
   <tr>
       <td class="week">月</td>
       <td class="week">火</td>
       <td class="week">水</td>
       <td class="week">木</td>
       <td class="week">金</td>
       <td class="week">土</td>
       <td class="week">日</td>
   </tr>

<!-- ここに calendar.php を入れる --> 

</table>

tableで枠組みを作ります。
最上段部分は曜日を入れて、その下にPHPのカレンダーを入れます。

カレンダーのCSS

Calendar Style

.calendar {
  border-collapse: collapse;
  border-color:#47a3da;
  border-style:solid;
  border-width:6px;
  margin:100px auto 0 auto;
  padding:0;
  width:80%;
  /* ボーダーを内側に引く */
  box-sizing: border-box;
  -moz-box-sizing: border-box;
  -webkit-box-sizing: border-box;
  -o-box-sizing: border-box;
  -ms-box-sizing: border-box;
  }

tr {
  height:70px;
  width:100%;
  }

td.week {
  border-style:solid;
  border-width:0 2px 0 0;
  padding:0;
  text-align: center;
  vertical-align: middle;
  }

td.week:last-child {
  border:none;
  }

td.day {
  border-style:solid;
  border-width:2px 2px 0 0;
  padding:0;
  text-align: center;
  vertical-align: middle;
  }

td.day:last-child {
  border-style:solid;
  border-width:2px 0 0 0;
  }

td.no-day {
  background-color:#47a3da;
  border-style:solid;
  border-width:2px 2px 0 0;
  opacity:0.2;
  padding:0;
  text-align: center;
  vertical-align: middle;
  }

このサイトに合わせているので、色や大きさは調整してください。
本来僕はこういう書き方をしていません。
こんな感じで書いてます。(正しくはないと思うけど…)
ファイルが縦長になるのが嫌いなんですよね…

body section#contents table.calendar { border-collapse: collapse; border-color:#47a3da; border-style:solid; border-width:6px; margin:100px auto 0 auto; padding:0; width:80%; }
body section#contents table.calendar { box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; -o-box-sizing: border-box; -ms-box-sizing: border-box; }
body section#contents table.calendar tr { height:70px; width:100%; }
body section#contents table.calendar tr td.week { border-style:solid; border-width:0 2px 0 0; padding:0; text-align: center; vertical-align: middle; }
body section#contents table.calendar tr td.week:last-child { border:none; }
body section#contents table.calendar tr td.day { border-style:solid; border-width:2px 2px 0 0; padding:0; text-align: center; vertical-align: middle; }
body section#contents table.calendar tr td.day:last-child { border-style:solid; border-width:2px 0 0 0; }
body section#contents table.calendar tr td.no-day { background-color:#47a3da; border-style:solid; border-width:2px 2px 0 0; opacity:0.2; padding:0; text-align: center; vertical-align: middle; }

コードって人それぞれ書き方に癖があると思うので、僕の書き方は突っ込まないでください。
(インデントって知ってる?って指摘された事があるから今回はちょっと頑張ったw)

PHPで作るカレンダー、どうだったでしょうか。
PHP書けるようになると、そんな大して難しい事じゃないと思いますが、PHP勉強したての頃はカレンダーが大嫌いでした。
もぅ for とか意味分からなかったですもん。
でも全部独学なので、もっといい書き方があったらすみません。