質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

1回答

1168閲覧

カレンダーに作成の分からないコードについて

sa-t

総合スコア4

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2021/01/26 08:00

php

1<?php 2// タイムゾーンを設定 3date_default_timezone_set('Asia/Tokyo'); 4 5// 前月・次月リンクが押された場合は、GETパラメーターから年月を取得 6if (isset($_GET['ym'])) { 7 $ym = $_GET['ym']; 8} else { 9 // 今月の年月を表示 10 $ym = date('Y-m'); 11} 12 13// タイムスタンプを作成し、フォーマットをチェックする 14$timestamp = strtotime($ym . '-1'); 15if ($timestamp === false) { 16 $ym = date('Y-m'); 17 $timestamp = strtotime($ym . '-1'); 18} 19 20// 今日の日付 フォーマット  21$today = date('Y-m-j'); 22 23// カレンダーのタイトルを作成  24$html_title = date('Y年m月', $timestamp); 25 26// 前月・次月の年月を取得 27// strtotimeを使う 28$prev = date('Y-m', strtotime('-1 month', $timestamp)); 29$next = date('Y-m', strtotime('+1 month', $timestamp)); 30 31// 該当月の日数を取得 32$day_count = date('t', $timestamp); 33 34// 1日が何曜日か 0:日 1:月 2:火 ... 6:土 35$youbi = date('w', $timestamp); 36 37// カレンダー作成の準備 38$weeks = []; 39$week = ''; 40 41// 第1週目:空のセルを追加 42// 例)1日が水曜日だった場合、日曜日から火曜日の3つ分の空セルを追加する 43$week .= str_repeat('<td></td>', $youbi); 44 45for ( $day = 1; $day <= $day_count; $day++, $youbi++) { 46 47 $date = $ym . '-' . $day; 48 49 if ($today == $date) { 50 // 今日の日付の場合は、class="today"をつける 51 $week .= '<td class="today">' . $day; 52 } else { 53 $week .= '<td>' . $day; 54 } 55 $week .= '</td>'; 56 57 // 週終わり、または、月終わりの場合 58 if ($youbi % 7 == 6 || $day == $day_count) { 59 60 if ($day == $day_count) { 61 // 月の最終日の場合、空セルを追加 62 // 例)最終日が木曜日の場合、金・土曜日の空セルを追加 63 $week .= str_repeat('<td></td>', 6 - ($youbi % 7)); 64 } 65 66 // weeks配列にtrと$weekを追加する 67 $weeks[] = '<tr>' . $week . '</tr>'; 68 69 // weekをリセット 70 $week = ''; 71 } 72} 73 74?> 75 76<!DOCTYPE html> 77<html lang="ja"> 78<head> 79 <meta charset="utf-8"> 80 <title>PHPカレンダー</title> 81 82 <body> 83 <form action="calendar.php" method="GET"> 84 85 <p>年月を入力してください</p> 86 <p><input type="text" name="ym"></p> 87 <p><input type="submit" name="submitBtn" value="送信"></p> 88 89 </form> 90 91 92 <style> 93 .container { 94 font-family: 'Noto Sans JP', sans-serif; 95 margin-top: 10px; 96 } 97 h3 { 98 margin-bottom: 10px; 99 } 100 th { 101 height: 10px; 102 text-align: center; 103 } 104 td { 105 height: 10px; 106 } 107 .today { 108 background: pink; 109 } 110 th:nth-of-type(1), td:nth-of-type(1) { 111 color: red; 112 } 113 th:nth-of-type(7), td:nth-of-type(7) { 114 color: blue; 115 } 116 </style> 117</head> 118 119 <div class="container"> 120 <h3><a href="?ym=<?php echo $prev; ?>">&lt;</a> 121 <?php echo $html_title; ?> 122 <a href="?ym=<?php echo $next; ?>">&gt;</a></h3> 123 124 <table class="table table-bordered"> 125 <tr> 126 <th></th> 127 <th></th> 128 <th></th> 129 <th></th> 130 <th></th> 131 <th></th> 132 <th></th> 133 </tr> 134 <?php 135 foreach ($weeks as $week) { 136 echo $week; 137 } 138 139 ?> 140 </table> 141 </div> 142</body> 143</html> 144

phpのコードで何をしているかわからないコードがあります。
「//1日が水曜日だった場合、日曜日から火曜日の3つ分の空セルを追加する」から「//weekをリセット」までのコードで何をしているかわかる方いますか?
その前まではなんとなくわかりました。

php

1$week .= str_repeat('<td></td>', $youbi);

ちなみにstr_repeat関数は反復すると言うのは分かります。なのでtdタグを$youbi分、反復していると思っています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/01/26 08:42

直接の回答ではありませんが、phpはリモートデバッグできる仕組みがあるので、ぜひ活用して1行ごとに処理をチェックするようなステップ実行をお試しいただければ納得がいくかと。
sa-t

2021/01/26 08:44

vscodeで行っていますがそのような機能ありますか?
退会済みユーザー

退会済みユーザー

2021/01/26 09:27

あります。phpにXDebugモジュールを組み込み、php.iniでリモートデバッグできるように設定変更が必要なのと、VScodeのPHP DebugなどXDebugモジュールを使ったリモートデバッグができる拡張があります。
guest

回答1

0

こんな感じです。
・先月の 30日や 31日の td を出力します。
・当月 1~末日まで td を出力します。行が変わるときは新しい tr を出力します。
・翌月 1日や 2日の td を出力します。

先月や翌月の td とは、http://www.benri.com/calendar/ のグレーの部分です。

投稿2021/01/26 08:13

68user

総合スコア2005

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sa-t

2021/01/26 08:22

なるほど。ありがとうございます! ちなみに $date = $ym . '-' . $day; このコードは何を表しているか分かりますか?
68user

2021/01/26 08:28

$date = '2021-01' . '-' . '26' という感じで YYYY-MM-DD の文字列を作っているのではないかと推測いたします。
sa-t

2021/01/26 08:31

確かにそうでした!URLを見たらそうなっています! if ($today == $date) { // 今日の日付の場合は、class="today"をつける $week .= '<td class="today">' . $day; } else { $week .= '<td>' . $day; } $week .= '</td>'; この部分のclassの使い方についてお教えできますか?
68user

2021/01/26 08:34

よくわからない変数があれば print "ym: [$ym]"; # 追加 $date = $ym . '-' . $day; などと内容を表示させてみましょう。
68user

2021/01/26 08:39

本日日付の場合は class='today' として、別途定義してある css .today { background: pink; } にて、背景色がピンクになるのではないでしょうか。
sa-t

2021/01/26 08:45

そう言うことなんですね! ありがとうございます!
sa-t

2021/01/26 16:04

すみません。また質問なんですが、 if ($youbi % 7 == 6 || $day == $day_count) { if ($day == $day_count) { $week .= str_repeat('<td></td>', 6 - ($youbi % 7)); } $weeks[] = '<tr>' . $week . '</tr>'; $week = ''; } ここで、$youbi % 7 == 6は、なぜ7で割った余りを6にしていますか?
68user

2021/01/27 02:28

コメントにあるとおり、週終わりの判定のためだと思います。 曜日は 0:日曜~6:土曜 なので 6 と比較している。 $youbi++ で 1つずつカウントアップしているので 0, 1, … 6, 7, 8, … という値になるので 7で割って、現在の $day に入っている日の曜日を求めていると思われます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問