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

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

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

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

Q&A

解決済

3回答

5869閲覧

PHPで指定日付に関して、週の7日間の日付文字列を出力したい

IC445

総合スコア24

PHP

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

0グッド

0クリップ

投稿2019/01/18 01:32

PHPで指定した日付に関して、週の7日間の日付文字列を出力したいと考えています。
「2019-01-07」のような文字列がある場合に、該当の日付に関して、その週の月曜日から日曜日への文字列を7日分全て出力したいと考えております。
また、曜日は月曜日始まりです。

下記は今日に関する日付の出力ですが、「2019-01-07」のような文字列を指定して、その日付に関して行いたいという事です。
よろしくお願いいたします。

PHP

1<?php 2 echo $monday = date('Ymd', strtotime('Monday')) . '\n'; // 月曜日の日付 3 echo $tuesday = date('Ymd', strtotime('Tuesday')) . '\n'; // 火曜日の日付 4 echo $wednesday = date('Ymd', strtotime('Wednesday')) . '\n'; // 水曜日の日付 5 echo $thursday = date('Ymd', strtotime('Thursday')) . '\n'; // 木曜日の日付 6 echo $friday = date('Ymd', strtotime('Friday')) . '\n'; // 金曜日の日付 7 echo $saturday = date('Ymd', strtotime('Saturday')) . '\n'; // 土曜日の日付 8 echo $sunday = date('Ymd', strtotime('Sunday')) . '\n'; // 日曜日の日付 9?>

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

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

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

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

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

m.ts10806

2019/01/18 01:35

要件が不明なところがあります。2019/1/7はたまたま月曜日ですが、月曜以外の日付が投入されることもあるのでしょうか。
m.ts10806

2019/01/18 01:36

ちなみにdate("w")で出力してみると分かりますが、0が日曜日でそこから始まります。「月曜日開始で日曜日まで」ということでしょうか。 それとも「指定日を含めてその後1週間」でしょうか。
m.ts10806

2019/01/18 01:39 編集

つまり、2019/1/8という日付が投入されることがあったとしたら 2019/1/8~2019/1/14なのか2019/1/7~2019/1/13なのか というところですね。月曜しか投入されないということでしたら忘れてください
m.ts10806

2019/01/18 01:51

あと細かいですがシングルクォーテーションだと改行コードは出力できないのでご注意ください。
IC445

2019/01/18 01:57

「2019-01-07」は月曜日ですが、その他の曜日の日付も扱います。 指定日付から一週間ではなく、指定した日付が含まれる一週間です。 例えば、「2019-01-11」は金曜ですが、こちらの文字列から、下記の7日間分の文字列を得る事が目的です。 月曜日:2019-01-07 火曜日:2019-01-08 水曜日:2019-01-09 木曜日:2019-01-10 金曜日:2019-01-11 土曜日:2019-01-12 日曜日:2019-01-13 また、改行の件補足いただき、ありがとうございます。
m.ts10806

2019/01/18 01:58

了解です。回答修正します。
m.ts10806

2019/01/18 02:02

あとできれば要件としてそのコメントそのまま質問に対聞いただけますか? こちらのコメント欄はデフォルト非表示なのでパッと見、回答との連動性がとれません。
guest

回答3

0

ベストアンサー

仕様確認中ですが、「指定日から1週間」であれば下記

php

1$targetDate = '2019-01-07'; 2for($i=0;$i<7;$i++){ 3 echo date("Ymd",strtotime("+{$i} day",strtotime($targetDate)))."\n"; 4}

strtotime()の第1引数でtimeの書式を利用します。

曜日を表示したければwを指定すると日曜日が0として順番に6が土曜日でとれますので、
0=>日 ~ 6=>土 のような配列で変換テーブルを作って照合すると良いです。

コメントを受けて追記

「2019-01-07」は月曜日ですが、その他の曜日の日付も扱います。

指定日付から一週間ではなく、指定した日付が含まれる一週間です。
例えば、「2019-01-11」は金曜ですが、こちらの文字列から、下記の7日間分の文字列を得る事が目的です。
月曜日:2019-01-07
火曜日:2019-01-08
水曜日:2019-01-09
木曜日:2019-01-10
金曜日:2019-01-11
土曜日:2019-01-12
日曜日:2019-01-13

考え方。
+n day で「その日の何日後」が取得できることは上記で回答したとおり。
date("w") で曜日が数値がとれることも既に回答したとおりです。

「指定日が含まれる月曜日からの1週間」ということは
指定日の曜日から曜日の番号を引いて1を足したものが月曜日ということになります。
つまり、その日を求めて1週間を求めていけば良い訳ですね。
※日曜日の場合は0となり+1すると翌週になるので-7しておくなど考慮が必要

以下、実装例
※もっと簡潔に書けますが、順を追っていけるよう分解しました。

php

1//1週間の設定配列 2$weekconfig = [ 3 0=>"日", 4 1=>"月", 5 2=>"火", 6 3=>"水", 7 4=>"木", 8 5=>"金", 9 6=>"土" 10]; 11 12//指定日 13$targetDate = '2019-01-07'; 14//指定日の曜日 15$targetWeekDay = date("w",strtotime($targetDate)); 16//日曜日の場合は7を代入して調整 17if($targetWeekDay === "0"){ 18 $targetWeekDay = "7"; 19} 20//指定日を含む週の月曜日を求める 21$targetSunday = date("Ymd",strtotime("-".$targetWeekDay." day",strtotime($targetDate))); 22$targetMonday = date("Ymd",strtotime("+1 day",strtotime($targetSunday))); 23 24//月曜日から7日間加算してそれぞれの日付を出力 25for($i=0;$i<7;$i++){ 26 $w = date("w",strtotime("+{$i} day",strtotime($targetMonday)));//現在の曜日 27 echo date($weekconfig[$w]."曜日:Y-m-d",strtotime("+{$i} day",strtotime($targetMonday)))."\n"; 28}

投稿2019/01/18 01:57

編集2019/01/18 02:30
m.ts10806

総合スコア80765

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

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

yambejp

2019/01/18 02:04

「その週の月曜日から日曜日」みたいですよ
m.ts10806

2019/01/18 02:07

コメントもらう前にとりあえず回答した形になりました。 別途コメントにも書きましたが回答追記中です。
IC445

2019/01/18 03:10

>>mts10806様 ご丁寧な回答、ありがとうございました。 無事、目的の日付が取得できることを確認いたしました。 yambejp様とpapinianus様も、ありがとうございます。
m.ts10806

2019/01/18 03:20

解決されたようで何よりです。 今回かなり細分化して書きましたがそれは「コピペで使えるコードです」ということではなくて 「ロジック部分」(考え方とそれを実現するまでのプロセス)を伝えるためのものです。 簡素化しようと思えばいくらでも簡素化できたりします。date()以外を使う手もあります。 実現方法は1つではないですが「考え方をどうもてるか」でその後の成長曲線が大きく違ってきます。 参考にしてください。 ※パッと書いたように見えるかもしれませんが、コード量の割りに色々と検証したりデバッグしたりで意外と時間かかってます・・。
guest

0

php

1<?php 2$std = new DateTimeImmutable('2019-01-18'); 3$w = intval($std->format('w')); 4$adj = 1 - ($w === 0 ? 7 : $w); 5$mon = $std->modify("$adj days"); 6for($i = 0; $i < 7; $i++ ) { 7 echo $mon->modify("$i days")->format('Ymd').PHP_EOL; 8}

投稿2019/01/18 02:10

papinianus

総合スコア12705

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

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

papinianus

2019/01/18 02:34

todayを基準に-6から+6までを作って配列に入れて、前方は月曜がでてくるまでarray_shiftしてって、後ろは日曜が出てくるまでarray_popするっていうのでもできそう。いくらでもやりようがあるってことですね
guest

0

こんな感じで

PHP

1$str="2019-01-07"; 2$d=strtotime($str); 3$n=date('N',$d); 4$week=array_map(function($x) use($d,$n){ 5 return date("Y-m-d",$d+($x-$n)*60*60*24); 6},range(1,7)); 7 8print_r($week);

投稿2019/01/18 01:58

yambejp

総合スコア114572

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問