php初心者です。
最近はカレンダーを作っていますが、なかなか祝日名は正確に表示しません。試しますので、自分でholiday.csvファイルを作りました。
内容はこんな感じです。
2019-01-01,元日
2019-01-14,成人の日
2019-02-11,建国記念の日
2019-03-21,春分の日
2019-04-29,昭和の日
2019-04-30,休日
2019-05-01,休日
2019-05-02,休日
2019-05-03,憲法記念日
2019-05-04,みどりの日
2019-05-05,こどもの日
2019-05-06,休日
2019-07-15,海の日
2019-08-11,山の日
2019-08-12,休日
2019-09-16,敬老の日
2019-09-23,秋分の日
2019-10-14,体育の日
2019-10-22,休日
2019-11-03,文化の日
2019-11-04,休日
2019-11-23,勤労感謝の日
php
1<?php 2ini_set('display_errors', 1 ); 3ini_set('error_reporting', E_ALL); 4 5// タイムゾーンを設定 6date_default_timezone_set('Asia/Tokyo'); 7 8//1ケタの前に0をつける 9function output($a){ 10 if(ctype_digit(strval($a)) && 0 < $a && $a < 10 ){ 11 return "0".$a; 12 }else{ 13 return $a; 14 } 15} 16 17function loadHolidays() { 18//祝祭日データ CSV 方法2 19$file = file_get_contents('./holiday.csv'); 20$data = $file; 21// 行ごとに分割 22 $lines = explode("\n", $data); 23 $line = ''; 24 foreach ($lines as $line) { 25// カンマで分割 26 $cols = explode(",", $line); 27 $holidays[] = [ trim($cols[0]), trim($cols[1]) ]; 28 } 29// 現在から3年間分の年末年始を追加 30 $currentYear = intval(date('Y')); 31 for ($i = 0; $i < 1; $i++) { // 3年間 32 $y = $currentYear + $i; 33 $date = strtotime("$y-12-29"); // 12月29日から 34 for ($j = 0; $j < 6; $j++) { // 1月3日まで6日間 35 $dateStr = date('Y-m-d', $date); 36 $holidays[] = [ $dateStr, '年末年始' ]; 37 $date = strtotime("+1 day", $date); 38 } 39 } 40 return $holidays; 41} 42 43// 前月・次月リンクが押された場合は、GETパラメーターから年月を取得 44if (isset($_GET['ym'])) { 45 $ym = new DateTime ($_GET['ym']); 46 $ym -> format('Y-m'); 47 $nm = new DateTime($_GET['ym']); 48 $nm -> format('Y-m'); 49 $firstday = new DateTime ($_GET['ym']); 50 $firstday -> format('Y-m-01'); 51} else { 52 // 今月の年月を表示 53 $ym = new DateTime('now'); 54 $ym -> format('Y-m'); 55 $nm = new DateTime('now'); 56 $nm -> format('Y-m'); 57 $firstday = new DateTime('first day of this month'); 58 $firstday -> format('Y-m-d'); 59} 60 61// 今日の日付 62$today = new DateTime('now'); 63$today =$today -> format('Y-m-d'); 64 65// カレンダーのタイトルを作成 66$html_title = $ym -> format('Y年n月'); 67 68// 該当月の日数を取得 69$day_count = $ym -> format('t'); 70 71// 1日が何曜日か 0:日 1:月 2:火 ... 6:土 72$youbi = $firstday -> format('w'); 73 74// カレンダー作成の準備 75$weeks = []; 76$week = ''; 77 78// 第1週目:空のセルを追加 79// 例)1日が水曜日だった場合、日曜日から火曜日の3つ分の空セルを追加する 80$week .= str_repeat('<td></td>', $youbi); 81 82//祝日の関数を呼び出す 83 84$holidays = loadHolidays(); 85 86$holidaylist = array_column($holidays,0); 87$holidaynamelist = array_column($holidays,1); 88$a = array_flip($holidaylist); 89$b = array_flip($holidaynamelist); 90$c = array_combine($holidaylist,$holidaynamelist); 91var_dump($c); 92$d = array_flip($c); 93 94for ( $day = 1; $day <= $day_count; $day++, $youbi++) { 95 $dayday = output($day); 96 97 // 20XX-XX-X 98 $yearmonth=$ym -> format('Y-m'); 99 $date = $yearmonth . '-' . $dayday; 100 101 $holidayCheck = in_array($date,$holidaylist); 102 $holidayNamecheck = in_array($date,$d); 103 104 if ($today == $date) { 105 $week .='<td class = "today">' . $dayday; 106 } else if ($holidayCheck === true && $holidayNamecheck === true) { 107 $week .='<td class="rest">' . $dayday . implode($holidaynamelist); 108 } 109 else { 110 $week .= '<td>' .$dayday; 111 } 112 $week .= '</td>'; 113 114 // 週終わり、または、月終わりの場合 115 if ($youbi % 7 == 6 || $day == $day_count) { 116 117 if ($day == $day_count) { 118 // 月の最終日の場合、空セルを追加 119 // 例)最終日が木曜日の場合、金・土曜日の空セルを追加 120 $week .= str_repeat('<td></td>', 6 - ($youbi % 7)); 121 } 122 123 // week配列にtrを追加する 124 $weeks[] = '<tr>' . $week . '</tr>'; 125 126 // weekをリセット 127 $week = ''; 128 } 129} 130 131// 前月・次月の年月を取得 132$prev =$ym -> modify('first day of last month'); 133$next =$nm -> modify('first day of next month'); 134 135?> 136<!DOCTYPE HTML> 137<html> 138<head> 139<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 140 141<title>PHPカレンダー</title> 142 143<link rel="stylesheet" type="text/css" href="style.css"> 144</head> 145 146<body> 147 <div class="container"> 148 <h3><a href="./?ym=<?php echo $prev ->format('Y-m'); ?>"><input type="submit" value="<" class="btn"></a> <?php echo $html_title; ?> <a href="./?ym=<?php echo $next ->format('Y-m'); ?>"><input type="submit" value=">" class="btn"></a></h3> 149 <table class="table-table-bordered"> 150 <tr> 151 <th>日</th> 152 <th>月</th> 153 <th>火</th> 154 <th>水</th> 155 <th>木</th> 156 <th>金</th> 157 <th>土</th> 158 </tr> 159 <?php 160 foreach ($weeks as $week) { 161 echo $week; 162 } 163 ?> 164 </table> 165 </div> 166</body> 167</html>
よろしくお願いいたします。