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

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

ただいまの
回答率

89.65%

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

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 589

IC445

score 22

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

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

<?php
  echo $monday = date('Ymd', strtotime('Monday')) . '\n'; // 月曜日の日付
  echo $tuesday = date('Ymd', strtotime('Tuesday')) . '\n'; // 火曜日の日付
  echo $wednesday = date('Ymd', strtotime('Wednesday')) . '\n'; // 水曜日の日付
  echo $thursday = date('Ymd', strtotime('Thursday')) . '\n'; // 木曜日の日付
  echo $friday = date('Ymd', strtotime('Friday')) . '\n'; // 金曜日の日付
  echo $saturday = date('Ymd', strtotime('Saturday')) . '\n'; // 土曜日の日付
  echo $sunday = date('Ymd', strtotime('Sunday')) . '\n'; // 日曜日の日付
?>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • IC445

    2019/01/18 10: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 10:58

    了解です。回答修正します。

    キャンセル

  • m.ts10806

    2019/01/18 11:02

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

    キャンセル

回答 3

checkベストアンサー

+1

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

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


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しておくなど考慮が必要

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

//1週間の設定配列
$weekconfig = [
    0=>"日",
    1=>"月",
    2=>"火",
    3=>"水",
    4=>"木",
    5=>"金",
    6=>"土"
];

//指定日
$targetDate = '2019-01-07';
//指定日の曜日
$targetWeekDay = date("w",strtotime($targetDate));
//日曜日の場合は7を代入して調整
if($targetWeekDay === "0"){
    $targetWeekDay = "7";
}
//指定日を含む週の月曜日を求める
$targetSunday = date("Ymd",strtotime("-".$targetWeekDay." day",strtotime($targetDate)));
$targetMonday = date("Ymd",strtotime("+1 day",strtotime($targetSunday)));

//月曜日から7日間加算してそれぞれの日付を出力
for($i=0;$i<7;$i++){
    $w = date("w",strtotime("+{$i} day",strtotime($targetMonday)));//現在の曜日
    echo date($weekconfig[$w]."曜日:Y-m-d",strtotime("+{$i} day",strtotime($targetMonday)))."\n";
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/18 11:04

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

    キャンセル

  • 2019/01/18 11:07

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

    キャンセル

  • 2019/01/18 12:10

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

    yambejp様とpapinianus様も、ありがとうございます。

    キャンセル

  • 2019/01/18 12:20

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

    キャンセル

+1

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/18 11:34

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

    キャンセル

0

こんな感じで

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

print_r($week);

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 89.65%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る