前提・実現したいこと
phpでカレンダーを作っている最中で、内閣府の祝日一覧csvファイルを読み込みカレンダーに挿入して表示したいと考えているのですが、コードがうまく組めません。csvファイルを配列で読み込み、挿入しようと考えています。
これから先がわからないので、よろしければ詳しくご教授おねがいします。
該当のソースコード
php
1<?php 2//--csvを取得 3$csv = file_get_contents('https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv'); 4 5//--UTF8へ変換 6$csv = mb_convert_encoding($csv,'UTF-8','SJIS-win'); 7 8//--正規表現で抜き出す 9if (!preg_match_all('/(\d{4})/(\d{1,2})/(\d{1,2}),(.+)/u', $csv, $matchAllAry, PREG_SET_ORDER)) { 10 die('Error'); 11} 12 13$holidayAry = []; 14 15foreach($matchAllAry as $matchAry) { 16 list(,$year,$month,$day,$name) = $matchAry; 17 18 $tmpAry = [ 19 $year, 20 sprintf('%02d',$month), 21 sprintf('%02d',$day), 22 ]; 23 24 $holidayAry[$year][implode('/',$tmpAry)] = trim($name); 25 26} 27 28 29function h($s) { 30 return htmlspecialchars($s, ENT_QUOTES, 'UTF-8'); 31} 32 33try { 34 if(!isset($_GET['t']) || !preg_match('/\A\d{4}-\d{2}\z/',$_GET['t'])) { 35 throw new Exception(); 36 } 37 $thisMonth = new DateTime($_GET['t']); 38}catch(Exception $e) { 39 $thisMonth = new DateTime('first day of this month'); 40} 41 42$dt = clone $thisMonth; 43$prev = $dt->modify('-1 month')->format('Y-m'); 44$dt = clone $thisMonth; 45$next = $dt->modify('+1 month')->format('Y-m'); 46 47$yearMonth = $thisMonth->format('F Y'); 48 49$tail=''; 50$lastDayOfPrevMonth = new DateTime('last day of'.$yearMonth.'-1 month'); 51while($lastDayOfPrevMonth->format('w') < 6) { 52 $tail = sprintf('<td class="gray">%d</td>', 53 $lastDayOfPrevMonth->format('d')).$tail; 54 $lastDayOfPrevMonth->sub(new DateInterval('P1D')); 55} 56$body = ''; 57$period = new DatePeriod( 58 new DateTime('first day of '.$yearMonth), 59 new DateInterval('P1D'), 60 new DateTime('first day of'. $yearMonth.'+1 month') 61); 62$today = new Datetime('today'); 63foreach($period as $day) { 64 if($day->format('w')%7 === 0 ) {$body.='</tr><tr>';} 65 $todayClass = ($day->format('Y-m-d') === $today->format('Y-m-d')) ? 'today' : ''; 66 67 $body.=sprintf('<td class="youbi_%d %s">%d</td>',$day->format('w'),$todayClass,$day->format('d')); 68} 69 70$head=''; 71$firstDayOfNextMonth = new DateTime('first day of'. $yearMonth.'+1 month'); 72while($firstDayOfNextMonth->format('w') > 0){ 73 $head.=sprintf('<td class="gray">%d</td>',$firstDayOfNextMonth->format('d') ); 74 $firstDayOfNextMonth->add(new DateInterval('P1D')); 75} 76 77$html ='<tr>'.$tail.$body.$head.$tsv.'</tr>'; 78 79?> 80<!DOCTYPE html> 81<html lang="ja"> 82<head> 83 <meta charset="utf-8"> 84 <title>Calender</title> 85 <style> 86 body { 87 font-family: Arial, sans-serif; 88 font-size: 14px; 89} 90a { 91 text-decoration:none; 92} 93table{ 94 margin:15px auto; 95 border:1px solid #ddd; 96 border-collapse: collapse; 97} 98th{ 99 background:#eee; 100} 101th,td { 102 padding:14px; 103 text-align:center; 104} 105 106.youbi_0 { 107 color:red; 108} 109.youbi_6{ 110 color:blue; 111} 112.today { 113 font-weight:bold; 114} 115.gray { 116 color:#dedede; 117} 118</style> 119</head> 120<body> 121 <table> 122 <thead> 123 <tr> 124 <th><a href="practice.php/?t=<?php echo h($prev); ?>">«</a></th> 125 <th colspan="5"><?php echo $yearMonth; ?></th> 126 <th><a href="practice.php/?t=<?php echo h($next); ?>">»</a></th> 127 </tr> 128 </thead> 129 <tbody> 130 <tr> 131 <td>Sun</td> 132 <td>Mon</td> 133 <td>Tue</td> 134 <td>Wed</td> 135 <td>Thu</td> 136 <td>Fri</td> 137 <td>Sat</td> 138 </tr> 139 <tr> 140 <?php echo $html; ?> 141 </tr> 142 </tbody> 143 <tfoot> 144 <tr> 145 <th colspan="7"><a href="practice.php/?t">Today</a></th> 146 </tr> 147 </tfoot> 148 </table> 149</body> 150</html>
補足情報(FW/ツールのバージョンなど)
MAMPローカルホスト
あなたの回答
tips
プレビュー