[PHP]カレンダーに祝日を表示する方法[わかりやすく解説]
みなさんこんにちは!ワトスンです。
今回は、、
といった疑問に答えます。
■読んでほしい人
PHPの基礎を理解できている人/PHPでカレンダーの作り方を理解できている人
PHPでのカレンダー作成方法については下の記事をご覧下さい。
今回はカレンダーを作成できている前提で、「祝日を表示させる方法」をご紹介していきます。
祝日を取得するにあたって、「GoogleカレンダーAPI」を使用していきます。
わかりにくいプログラムはできるだけ除き、シンプルにわかりやすくご紹介していきますので初心者の方も安心してご覧下さい。
■完成画像
目次
PHP言語でカレンダーに祝日を表示させる方法
カレンダーに祝日を表示させる方法をご紹介していきます。
手順としては、
1:全ての祝日を取得する
2:各日の祝日名を取得する
3:日付と祝日を照らし合わせる
といった感じです。
それぞれの工程を1つ1つ丁寧に解説してますので、ぜひご覧下さい。
全ての祝日を取得する
まずは「GoogleカレンダーAPI」を使用して、カレンダーの祝日だけを取得していきます。
APIの取得方法は「GoogleカレンダーAPI取得方法」からご覧下さい。
今回はAPIが取得できているものとして解説していきます。
このAPIを使用して祝日の配列を取得する関数(getHolidays)を作成します。
プログラムは以下の通り組んでいきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
<?php //GoogleカレンダーAPIから祝日を取得 $year = date("Y"); function getHolidays($year) {//その年の祝日を全て取得する関数を作成 $api_key = 'ここにAPIを入れる'; //取得したAPIを入れる $holidays = array(); //祝日を入れる配列の箱を用意しておく $holidays_id = 'japanese__ja@holiday.calendar.google.com'; $url = sprintf( //sprintf関数を使用しURLを設定 //このURLはGoogleカレンダー独自のURL //Googleカレンダーから祝日を調べるURL 'https://www.googleapis.com/calendar/v3/calendars/%s/events?'. 'key=%s&timeMin=%s&timeMax=%s&maxResults=%d&orderBy=startTime&singleEvents=true', $holidays_id, $api_key, $year.'-01-01T00:00:00Z' , // 取得開始日 $year.'-12-31T00:00:00Z' , // 取得終了日 150 // 最大取得数 ); if ( $results = file_get_contents($url, true )) { //file_get_contents関数を使用 //URLの中に情報が入っていれば(trueなら)以下を実行する $results = json_decode($results); //JSON形式で取得した情報を配列に格納 foreach ($results->items as $item ) { $date = strtotime((string) $item->start->date); $title = (string) $item->summary; $holidays[date('Y-m-d', $date)] = $title; //年月日をキー、祝日名を配列に格納 } ksort($holidays); //祝日の配列を並び替え //ksort関数で配列をキーで逆順に(1月からの順番にした) } return $holidays; } ?> |
といった感じで祝日を取得します。
上のプログラムで出てきた関数「sprintf関数」と「file_get_contents関数」の使い方がわからない方は、
「sprintf関数の使い方」
「file_get_contents関数の使い方」
からご確認下さい。
ちなみに作成したgetHolidays関数を出力して確かめてみると、、
1 2 3 4 |
<?php $Holidays_array = getHolidays($year); print_r($Holidays_array); ?> |
このような感じになっています。
「いつにどんな祝日があるか」という情報が配列で存在しています。
上のプログラムでは祝日の情報を取得しただけなので、祝日情報からそれぞれの「祝日名」だけを取得していきます。
各祝日名を取得する
祝日情報からそれぞれの「祝日名」だけを取得していきます。
祝日名だけを取得していく関数(display_to_Holidays)を作成します。
プログラムは以下の通り組んでいきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php //その日の祝日名を取得 function display_to_Holidays($date,$Holidays_array) { //※引数1は日付"Y-m-d"型、引数に2は祝日の配列データ //display_to_Holidays("Y-m-d","Y-m-d") →引数1の日付と引数2の日付が一致すればその日の祝日名を取得する if(array_key_exists($date,$Holidays_array)){ //array_key_exists関数を使用 //$dateが$Holidays_arrayに存在するか確認 //各日付と祝日の配列データを照らし合わせる $holidays = "<br/>".$Holidays_array[$date]; //祝日が見つかれば祝日名を$holidaysに入れておく return $holidays; } } //その日の祝日名を取得 ?> |
といった感じで祝日名を取得します。
上のプログラムで使用した「array_key_exists関数」の使い方がわからない方は、「array_key_exists関数の使い方」をご覧下さい。
ここまででそれぞれの祝日名を取得することができたので、あとはこれをカレンダーの日付と照らし合わせて表示させていきます。
日付と祝日を照らし合わせカレンダーに表示
最後に、日付と祝日を照らし合わせカレンダーに祝日名を表示させていきます。
先ほど作成した関数「display_to_Holidays関数」は祝日名を取得しただけです。
「display_to_Holidays関数」では引数が2つ出てきました。
・$date
・$Holidays_array
の2つです。
「display_to_Holidays関数」は、
・$Holidays_arrayの中にある祝日情報の配列
・$date(1月1日〜12月31日)の1日ずつ全て
を確認していく関数です。
例:
2021-02-01は祝日があるかな?→ない→祝日名がないので無視。はい次!
・
・
・
2021-02-23は祝日があるかな?→建国記念日だ!→祝日名をゲット!!
・
・
・
2021-12-31は・・・
みたいなイメージです。
つまり、$date(1/1~12/31の各日付)と$Holidays_array(祝日)を照らし合わせる手順が必要になってきます。
$dateに1月1日から順番に日付を挿入していく必要があります。
365個1つずつ挿入するのは大変なのでプログラムを組んでいきます。
そしてカレンダーに祝日の場合は祝日名を表示していきます。
プログラムは以下の通り組んでいきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
<!-----------カレンダープログラム---------------> <?php //タイムゾーンを設定 date_default_timezone_set('Asia/Tokyo'); //前月・次月リンクが選択された場合は、GETパラメーターから年月を取得 if(isset($_GET['ym'])){ $ym = $_GET['ym']; }else{ //今月の年月を表示 $ym = date('Y-m'); } //タイムスタンプ(どの時刻を基準にするか)を作成し、フォーマットをチェックする //strtotime('Y-m-01') $timestamp = strtotime($ym . '-01'); if($timestamp === false){//エラー対策として形式チェックを追加 //falseが返ってきた時は、現在の年月・タイムスタンプを取得 $ym = date('Y-m'); $timestamp = strtotime($ym . '-01'); } //今月の日付 フォーマット 例)2020-10-2 $today = date('Y-m-j'); //カレンダーのタイトルを作成 例)2020年10月 $html_title = date('Y年n月', $timestamp);//date(表示する内容,基準) //前月・次月の年月を取得 //strtotime(,基準) $prev = date('Y-m', strtotime('-1 month', $timestamp)); $next = date('Y-m', strtotime('+1 month', $timestamp)); //該当月の日数を取得 $day_count = date('t', $timestamp); //1日が何曜日か $youbi = date('w', $timestamp); //カレンダー作成の準備 $weeks = []; $week = ''; //第1週目:空のセルを追加 //str_repeat(文字列, 反復回数) $week .= str_repeat('<td></td>', $youbi); for($day = 1; $day <= $day_count; $day++, $youbi++){ $date = $ym . '-' . $day; //それぞれの日付をY-m-d形式で表示例:2020-01-23 //$dayはfor関数のおかげで1日づつ増えていく $Holidays_day = display_to_Holidays(date("Y-m-d",strtotime($date)),$Holidays_array); //display_to_Holidays($date,$Holidays_array)の$dateに1/1~12/31の日付を入れる if($today == $date){ //もしその日が今日なら $week .= '<td class="today">' . $day;//今日の場合はclassにtodayをつける }elseif(display_to_Holidays(date("Y-m-d",strtotime($date)),$Holidays_array)){ //もしその日に祝日が存在していたら //その日が祝日の場合は祝日名を追加しclassにholidayを追加する $week .= '<td class="holiday">' . $day . $Holidays_day; }else{ //上2つ以外なら $week .= '<td>' . $day; } $week .= '</td>'; if($youbi % 7 == 6 || $day == $day_count){//週終わり、月終わりの場合 //%は余りを求める、||はまたは //土曜日を取得 if($day == $day_count){//月の最終日、空セルを追加 $week .= str_repeat('<td></td>', 6 - ($youbi % 7)); } $weeks[] = '<tr>' . $week . '</tr>'; //weeks配列にtrと$weekを追加 $week = '';//weekをリセット } } ?> <!-----------カレンダープログラム---------------> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>PHPカレンダー</title> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> <link href="https://fonts.googleapis.com/css?family=Noto+Sans" rel="stylesheet"> <style> .container { font-family: 'Noto Sans', sans-serif; margin-top: 80px; } h3 { margin-bottom: 30px; } th { height: 30px; text-align: center; } td { height: 100px; } .today { background: orange; } th:nth-of-type(1), td:nth-of-type(1) { color: red; } th:nth-of-type(7), td:nth-of-type(7) { color: blue; } .holiday{ color: red; } </style> </head> <body id=""> <div class="container"> <h3><a href="?ym=<?php echo $prev; ?>"><</a><?php echo $html_title; ?><a href="?ym=<?php echo $next; ?>">></a></h3> <table class="table table-bordered"> <tr> <th>日</th> <th>月</th> <th>火</th> <th>水</th> <th>木</th> <th>金</th> <th>土</th> </tr> <?php foreach ($weeks as $week) { echo $week; } ?> </table> </div> </body> </html> |
といった感じでカレンダーに祝日名を表示させます。
カレンダーの細かい作成方法は、下↓の記事をご覧下さい。
以上でカレンダーに祝日を表示させる手順は終わりです。
完成形のプログラム
最後にコピペでも使用できるように、全てまとめたプログラムを置いておきます。↓
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 |
<?php /* Template Name: カレンダー */ ?> <!-----------祝日取得---------------> <?php //GoogleカレンダーAPIから祝日を取得 $year = date("Y"); function getHolidays($year) {//その年の祝日を全て取得する関数を作成 $api_key = 'AIzaSyD6CTJIgl8r3EXcBL4T8gW6Rdp51thlMZ8'; //取得したAPIを入れる $holidays = array(); //祝日を入れる配列の箱を用意しておく $holidays_id = 'japanese__ja@holiday.calendar.google.com'; $url = sprintf( //sprintf関数を使用しURLを設定 //このURLはGoogleカレンダー独自のURL //Googleカレンダーから祝日を調べるURL 'https://www.googleapis.com/calendar/v3/calendars/%s/events?'. 'key=%s&timeMin=%s&timeMax=%s&maxResults=%d&orderBy=startTime&singleEvents=true', $holidays_id, $api_key, $year.'-01-01T00:00:00Z' , // 取得開始日 $year.'-12-31T00:00:00Z' , // 取得終了日 150 // 最大取得数 ); if ( $results = file_get_contents($url, true )) { //file_get_contents関数を使用 //URLの中に情報が入っていれば(trueなら)以下を実行する $results = json_decode($results); //JSON形式で取得した情報を配列に格納 foreach ($results->items as $item ) { $date = strtotime((string) $item->start->date); $title = (string) $item->summary; $holidays[date('Y-m-d', $date)] = $title; //年月日をキー、祝日名を配列に格納 } ksort($holidays); //祝日の配列を並び替え //ksort関数で配列をキーで逆順に(1月からの順番にした) } return $holidays; } $Holidays_array = getHolidays($year); //getHolidays関数を$Holidays_arrayに代入して使用しやすいようにしておく //その日の祝日名を取得 function display_to_Holidays($date,$Holidays_array) { //※引数1は日付"Y-m-d"型、引数に2は祝日の配列データ //display_to_Holidays("Y-m-d","Y-m-d") →引数1の日付と引数2の日付が一致すればその日の祝日名を取得する if(array_key_exists($date,$Holidays_array)){ //array_key_exists関数を使用 //$dateが$Holidays_arrayに存在するか確認 //各日付と祝日の配列データを照らし合わせる $holidays = "<br/>".$Holidays_array[$date]; //祝日が見つかれば$holidaysに入れておく return $holidays; } } //その日の祝日名を取得 ?> <!-----------祝日取得---------------> <!-----------カレンダープログラム---------------> <?php //タイムゾーンを設定 date_default_timezone_set('Asia/Tokyo'); //前月・次月リンクが選択された場合は、GETパラメーターから年月を取得 if(isset($_GET['ym'])){ $ym = $_GET['ym']; }else{ //今月の年月を表示 $ym = date('Y-m'); } //タイムスタンプ(どの時刻を基準にするか)を作成し、フォーマットをチェックする //strtotime('Y-m-01') $timestamp = strtotime($ym . '-01'); if($timestamp === false){//エラー対策として形式チェックを追加 //falseが返ってきた時は、現在の年月・タイムスタンプを取得 $ym = date('Y-m'); $timestamp = strtotime($ym . '-01'); } //今月の日付 フォーマット 例)2020-10-2 $today = date('Y-m-j'); //カレンダーのタイトルを作成 例)2020年10月 $html_title = date('Y年n月', $timestamp);//date(表示する内容,基準) //前月・次月の年月を取得 //strtotime(,基準) $prev = date('Y-m', strtotime('-1 month', $timestamp)); $next = date('Y-m', strtotime('+1 month', $timestamp)); //該当月の日数を取得 $day_count = date('t', $timestamp); //1日が何曜日か $youbi = date('w', $timestamp); //カレンダー作成の準備 $weeks = []; $week = ''; //第1週目:空のセルを追加 //str_repeat(文字列, 反復回数) $week .= str_repeat('<td></td>', $youbi); for($day = 1; $day <= $day_count; $day++, $youbi++){ $date = $ym . '-' . $day; //それぞれの日付をY-m-d形式で表示例:2020-01-23 //$dayはfor関数のおかげで1日づつ増えていく $Holidays_day = display_to_Holidays(date("Y-m-d",strtotime($date)),$Holidays_array); //display_to_Holidays($date,$Holidays_array)の$dateに1/1~12/31の日付を入れる if($today == $date){ //もしその日が今日なら $week .= '<td class="today">' . $day;//今日の場合はclassにtodayをつける }elseif(display_to_Holidays(date("Y-m-d",$today_strtotime),$Holidays_array)){ //もしその日に祝日が存在していたら //その日が祝日の場合は祝日名を追加しclassにholidayを追加する $week .= '<td class="holiday">' . $day . $Holidays_day; }else{ //上2つ以外なら $week .= '<td>' . $day; } $week .= '</td>'; if($youbi % 7 == 6 || $day == $day_count){//週終わり、月終わりの場合 //%は余りを求める、||はまたは //土曜日を取得 if($day == $day_count){//月の最終日、空セルを追加 $week .= str_repeat('<td></td>', 6 - ($youbi % 7)); } $weeks[] = '<tr>' . $week . '</tr>'; //weeks配列にtrと$weekを追加 $week = '';//weekをリセット } } ?> <!-----------カレンダープログラム---------------> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>PHPカレンダー</title> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> <link href="https://fonts.googleapis.com/css?family=Noto+Sans" rel="stylesheet"> <style> .container { font-family: 'Noto Sans', sans-serif; margin-top: 80px; } h3 { margin-bottom: 30px; } th { height: 30px; text-align: center; } td { height: 100px; } .today { background: orange; } th:nth-of-type(1), td:nth-of-type(1) { color: red; } th:nth-of-type(7), td:nth-of-type(7) { color: blue; } .holiday{ color: red; } </style> </head> <body id=""> <div class="container"> <h3><a href="?ym=<?php echo $prev; ?>"><</a><?php echo $html_title; ?><a href="?ym=<?php echo $next; ?>">></a></h3> <table class="table table-bordered"> <tr> <th>日</th> <th>月</th> <th>火</th> <th>水</th> <th>木</th> <th>金</th> <th>土</th> </tr> <?php foreach ($weeks as $week) { echo $week; } ?> </table> </div> </body> </html> |
長いですが全て理解できたでしょうか。。。
コピペで終わらせず1つ1つ理解しよう
今回は「PHPでカレンダーに祝日を表示させる方法」をご紹介してきました。
PHP言語初心者の方はぜひ挑戦して欲しいです。
プログラミングは基本独学でできます。
正直プログラミングスクールなんか通う必要はないと思います。
ですが独学でも正しく学んでいかないと成長スピードは遅くなります。
どんどん成長していくにはとにかくその言語にたくさん触れていくことが大切です。
なんでもいいのでとりあえず作ってみる。すると知らぬ間に成長しています。
どんどん挑戦していって失敗を繰り返して成長していきましょう。
コピペで終わらせず、「なんでこんなプログラムになるのか」など1つ1つ考え理解していって下さい。
わからないことがあれば気軽に聞いて下さい。
暇人なのですぐ答えます!!
お互い頑張っていきましょう。
以上です。
1 件の投稿