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

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

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

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

Q&A

解決済

2回答

3823閲覧

PHP 第●●週の○○曜日の日付の出力について

hiro0208

総合スコア75

PHP

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

0グッド

0クリップ

投稿2017/03/30 07:09

日付取得のロジックが理解できない状態です。

月初日の曜日を元にして第1 ○○曜日(取得したい曜日)の日付を求めます。
とあるのですが、

** $firstDay = $weekday - $weekdayOfFirst + 1;**
この$weekday(曜日の値)から$weekdayOfFirst(取得したい値)に1を加えたら
なぜ日付が求まるのかわかりません。
この**+1**とは何のためにあるのでしょうか?

php

1<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2<html> 3<head> 4<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 5<title>第3月曜日を求めたい</title> 6</head> 7<body> 8<?php 9echo '<p>2017年7月の第3月曜日(海の日)を計算する</p>'; 10 11$year = 2017; 12$month = 7; 13$week = 3; 14$weekday = 2; // 月曜日 15 16echo '<ul>'; 17echo '<li>年: ' . $year . '</li>'; 18echo '<li>月: ' . $month . '</li>'; 19echo '<li>週番号: ' . $week . '</li>'; 20echo '<li>曜日、0(日曜)から6(土曜): ' . $weekday . '</li>'; 21echo '</ul>'; 22 23echo '<p>計算結果: '; 24$ret = getNthWeekday($year, $month, $week, $weekday); 25if ($ret !== FALSE) { 26 echo $ret . '日'; 27} else { 28 echo '該当する日付は存在しません'; 29} 30echo '</p>'; 31 32# getNthWeekday()関数 33# 指定年月の第○番目の○曜日の日付を返します。該当する日付が存在しない場合は 34# FALSEを返します。 35# 第1引数には年を指定します。 36# 第2引数には月を指定します。 37# 第3引数には週番号(第○週目)を指定します。 38# 第4引数には曜日を0(日曜)から6(土曜)の数値で指定します。 39function getNthWeekday($year, $month, $week, $weekday) { 40 // 週の指定が正しいか判定 41 if ($week < 1 || $week > 5) { 42 return FALSE; 43 } 44 // 曜日の指定が正しいか判定 45 if ($weekday < 0 || $weekday > 6) { 46 return FALSE; 47 } 48 49# 指定した年月の月初日(1日)の曜日を取得します。 50 $weekdayOfFirst = (int) date('w', mktime(0, 0, 0, $month, 1, $year)); 51 52# 月初日の曜日を元にして第1○曜日(取得したい曜日)の日付を求めます。 53 $firstDay = $weekday - $weekdayOfFirst + 1; 54 if ($firstDay <= 0) { 55 $firstDay += 7; 56 } 57 58# 第1○曜日に7の倍数を加算して、第○週の○曜日の日付を求めます。 59 $resultDay = $firstDay + 7 * ($week - 1); 60 61# 最後に計算結果が妥当な日付かどうかチェックします。 62 if (!checkdate($month, $resultDay, $year)) { 63 return FALSE; 64 } 65 66 return $resultDay; 67} 68?> 69</body> 70</html> 71 72

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

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

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

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

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

guest

回答2

0

php

1$firstDay = $weekday - $weekdayOfFirst + 1;

部分で変数$weekday$weekdayOfFirstは、いずれも

0(日曜)から6(土曜)の数値

の値を取るからです。

第4引数に指定した曜日 ($weekday) と第1○曜日 ($weekdayOfFirst) が一致している場合、変数$weekdayは「1日」であるべきなので+ 1している、というわけです。


ちなみに、ご提示のソースコードではgetNthWeekdayメソッドの使用方法に誤りがあります。

海の日を求めるために

$weekday = 2; // 月曜日

getNthWeekdayメソッドの第4引数に渡していますが、
同メソッドのコメントには以下のように記述してあります。

第4引数には曜日を0(日曜)から6(土曜)の数値で指定します。

つまり、このメソッドに「月曜日」を指定したい場合、数値の 1 を第4引数に渡す必要があります。

投稿2017/03/30 08:21

編集2017/03/30 08:53
KiyoshiMotoki

総合スコア4791

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

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

0

ベストアンサー

この処理を実行した結果が下記の通り、18日となってしまっていますが、実際には2017年の第3月曜日は17日ですね。。。渡す引数は$weekdayが1で良いですよね。
求めたい最初の月曜日の日付を求める事を考えると…

  1. $weekdayOfFirstは6(7月の最初の曜日は土曜日なので)が入ります。
  2. 問題の$firstDay = $weekday - $weekdayOfFirst + 1ですが、これを置き換えると+1しない状態では、1-6で-5となりますよね。それは存在しない日付なので、後のロジックで7を足すと2日になってしまいます。(つまり日曜日)

加算する時に月曜日を含めて加算するので、1日ズレるのです。

よって、この事象を避けるために作成者は1を加算したのだと思いますよ。

投稿2017/03/30 07:30

編集2017/03/30 07:41
motuo

総合スコア3027

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問