言語はphp、フレームワークはLaravelを使用しています。
指定した月の日付と、該当する曜日をサクッと取得したいです。
今回は、上記の疑問に答える記事です。
尚、解説で使用するソースコードはphpで、フレームワークは「Laravel」を使用しています。
が、素のphpコードでも、上記疑問の解決は可能ですので、ご安心くださいませ。
それでは早速、解説していきます。
私がやろうとしたこと
①初期表示として、今月のカレンダーとスケジュールを表示
②「次の月」、「前の月」のボタンを用意
③「次の月」をクリックすると来月、「前の月」をクリックすると先月をカレンダーとして表示する
つまり、予定表みたいなのを作ろうとしていました。
今回は、③をピックアップして解説しますね。
実際に書いたコード
メソッドを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文を記述。
これで、初日から末日までの年月日とその曜日が取得できます。
まとめ
指定月の取得の流れとして・・・
①初日と末日の年月日、末日の日を取得
②for文を使って、初日〜末日の日付を取得して、それぞれの日付に該当する曜日も取得
こんな感じです。
上記が出来ると、
データベースに登録されたスケジュールの取り出しが可能
になります。
引き続き記事にしたいプログラミング実装方法があれば、公開していく予定です。
記事は以上です、参考になれば幸いです。
ありがとうございました!