Sun~sun~Flower's

〜ITエンジニアとして日々前向きに生きていくノウハウブログ〜

MENU

【php】指定した月の日付と曜日をサクッと取得する方法

man-working-on-computer

言語はphp、フレームワークはLaravelを使用しています。
指定した月の日付と、該当する曜日をサクッと取得したいです。

今回は、上記の疑問に答える記事です。

 

尚、解説で使用するソースコードはphpで、フレームワークは「Laravel」を使用しています。

 

が、素のphpコードでも、上記疑問の解決は可能ですので、ご安心くださいませ。

 

それでは早速、解説していきます。

私がやろうとしたこと

challenge-on-startLine

①初期表示として、今月のカレンダーとスケジュールを表示

 

②「次の月」、「前の月」のボタンを用意

 

③「次の月」をクリックすると来月、「前の月」をクリックすると先月をカレンダーとして表示する

つまり、予定表みたいなのを作ろうとしていました。

 

今回は、③をピックアップして解説しますね。

実際に書いたコード

メソッドを2つ用意しました。

 

やっていることは、

【1つ目のメソッド】

・画面に表示する年月を取得

・年月の初日と末日、末日の日(31日や30日など)を取得

・2つ目のメソッドを呼び出す

 

【2つ目のメソッド】

・年月の初日と末日を利用して、対象年月に登録されたスケジュールをテーブルから取得する

・指定年月の初日から末日までの日にちをスケジュールと合わせて、配列に格納

です。

尚、スケジュールを取得するコードも記載している旨、ご了承ください🙇‍♂️

 

まずはサラッと、コードに目を通して頂ければと思います。(横スクロール可能)

 // 画面に表示する年月を取得する
public function getMonthSchedule($request, $prevOrNext)
{
    $month = str_replace('年', '-', $request->thisMonth); // 取得年月の文字列から"年"を"-"に置換する
    $month = str_replace('月', '', $month); // "月"を"-"に置換する
    $month = date('Y-m', strtotime($month . $prevOrNext . ' 1 month')); // 取得年月の来月を取得する(先月か?来月か?)
    $from = date('Y-m-d', strtotime('first day of ' . $month));
    $to = date('Y-m-d', strtotime('last day of ' . $month));
    $lastDay= idate('d',strtotime('last day of '. $month));
    $arrMonthSchedule = $this->getTopSchedule($from, $to, $lastDay, $month);
    return $arrMonthSchedule;
}

// 日にちごとの曜日を取得
public function getTopSchedule($from, $to, $lastDay){
    $arrMonthSchedule = [];

    for($i = 0; $i < $lastDay; $i++){
        $day = date('Y-m-d', strtotime($from . '+' . $i . 'day')); // 日にちを取得し、日付型に変換
        $dayOfWeek = date('D', strtotime($from . '+' . $i . 'day')); // 曜日を取得し、日付型に変換
         
	$oneDaySchedule = []; // 日付と曜日を格納する配列を用意
	$oneDaySchedule = [
        	'day' => $day,
        	'dayOfWeek' => $dayOfWeek,
        ];
        array_push($arrMonthSchedule, $oneDaySchedule);
   }
   return $arrMonthSchedule;
}

解説

まず最初の画面に表示する、年月を取得するメソッドのgetMonthSchedule()についてです。

それぞれのソースコードにコメント(解説)を入れています。

public function getMonthSchedule($request, $prevOrNext)
{
    $month = str_replace('年', '-', $request->thisMonth); // $request->thisMonthから「年」の文字列を探し、「-(ハイフン)」に変換する
    $month = str_replace('月', '', $month); // $monthから「月」の文字列を探し、「-(ハイフン)」に変換する
    $month = date('Y-m', strtotime($month . $prevOrNext . ' 1 month')); // $monthに+1もしくは、-1した年月を取得して「2022-10」という日付形式で$monthに格納

    $from = date('Y-m-d', strtotime('first day of ' . $month)); // $monthの初日を取得して、例えば「2022-10-01」という日付形式で$fromに格納
    $to = date('Y-m-d', strtotime('last day of ' . $month)); // $monthの末日を取得して、例えば「2022-10-31」という日付形式で$toに格納

    $lastDay= idate('d',strtotime('last day of '. $month)); // $monthの末日を取得する、例えば2022年の10月なら「31」が取得できる
    $arrMonthSchedule = $this->getTopSchedule($from, $to, $lastDay, $month); // ここは後ほど解説します

    return $arrMonthSchedule; // 配列で返却
}

ちなみに、引数の$request,$prevOrNextについてですが、

$request・・・年月などの情報が入ったオブジェクト

ここでは、$request->thisMonthという指定で、「2022年10月」などの形式で取得が可能です。

$prevOrNext・・・「次の月」がクリックされたのか?「前の月」がクリックされたのか?を判別する値

正確には「次の月」なら「+」、「前の月」なら「-」が格納されるという事ですね。

 

続いては、11行目で呼び出す「getTopSchedule()」メソッドについてです。

それぞれのソースコードにコメント(解説)を入れています。

public function getTopSchedule($from, $to, $lastDay){ // $from:月の初日、$to:月の末日、$lastDay:末日の数値)
    $arrMonthSchedule = []; // 対象年月の日付とその曜日を格納する配列を用意

    for($i = 0; $i < $lastDay; $i++){ // 月の初日から末日までを見に行く
        $day = date('Y-m-d', strtotime($from . '+' . $i . 'day')); // 日にちを取得する(例えば、「2022-10-18」という形式で取得する)
        $dayOfWeek = date('D', strtotime($from . '+' . $i . 'day')); // 曜日を取得(Sun、Mon、Tue、Wed、Thu、Fri、Satという英語形式で取得する)

        $oneDaySchedule = []; // 日付と曜日を格納する配列を用意
        $oneDaySchedule = [
             'day' => $day,
             'dayOfWeek' => $dayOfWeek,
        ];
        array_push($arrMonthSchedule, $oneDaySchedule); // 1日ごとに$arrMonthScheduleに追加される
   }

   return $arrMonthSchedule;
}

まず始めに、配列$arrMonthScheduleを用意して、

・対象年月日

・曜日

の2つを格納していきます。

 

その為に年月の末日が入った$lastDayを利用して、for文を記述。

 

これで、初日から末日までの年月日とその曜日が取得できます。

まとめ

woman-working-on-computer

指定月の取得の流れとして・・・

①初日と末日の年月日、末日の日を取得

 

②for文を使って、初日〜末日の日付を取得して、それぞれの日付に該当する曜日も取得

こんな感じです。

 

上記が出来ると、

 

データベースに登録されたスケジュールの取り出しが可能

 

になります。

 

引き続き記事にしたいプログラミング実装方法があれば、公開していく予定です。

 

記事は以上です、参考になれば幸いです。

 

ありがとうございました!