【PHP】switchで曜日による振り分けコードをスッキリと【WordPress】

2024年7月13日

条件分岐の基本はif文です。

基本的には変数の値で動作を変えるときには、if文をガリガリ書いてますが。

ある案件で、曜日による呼び出すデータの変更を実装している時に、switch文を使ってみたのでその備忘録です。

if文の場合

ざっくりと実装する動作を書くと。

・アクセス日の日付を取得し、曜日を取得する
・曜日によって変数の中身を変える
・変数の中身のカスタムフィールド名のデータを取得する

というような感じでした。

最初はif文でこんな感じにガリガリ書いてました。

//日付の取得
  $check_date = new DateTimeImmutable( );
  //曜日による変数の変更
  if( $check_date->format( 'W' ) == 1 ){
    $weekday_main = 'Monday';
    $weekday_sub = 'mon';
  } elseif( $check_date->format( 'W' ) == 2 ){
    $weekday_main = 'Tuesday';
    $weekday_sub = 'Tue';
  } //以下曜日ごとの分岐が続く・・・

DateTimeImmutable()で当日の日付を取得し。

if文の条件の中で、曜日の数値データにformatし。

$weekday_mainと$weekday_subに、必要な文字列を格納していました。

普段ならこれでも書いてしまえば、そのまま変数を呼び出したいところに使えば良いので問題無いんですが。

一応、この記事用にif文の書き直しをしてみましたが。

もう一度書くのが嫌になるくらい行数が伸びる上に、可読性も悪く。

さらに良くコード全体を見てみると、似たような処理を繰り返すところもあり関数化した方が良いなぁと。

そんなこんなで、スッキリさせてしまうことにしました。

switch文の場合

switch文はPHPのドキュメンテーションでも例として載っているように、ifとelseifを使ったものと同じような動作を期待できます

それもあってswitch文を使うことにしました。

先ほど書き忘れましたが、曜日は0〜6の数字に振り分けられています。

月曜火曜水曜木曜金曜土曜日曜
1234560

この曜日の数字を条件として、switch文を書いて行きます。

function get_weekday_field_names(){
 //日付の取得
 $check_date = new DateTimeImmutable( );
 //曜日による値の変更
 switch( $check_date->format( 'w' ) ){
    case 0:
      return ['sunday', 'sun'];
      break;
    case 1:
      return ['monday', 'mon'];
      break;
    case 2:
      return ['tuesday', 'tue'];
      break;
    case 3:
      return ['wednesday', 'wed'];
      break;
    case 4:
      return ['thursday', 'thu'];
      break;
    case 5:
      return ['friday', 'fri'];
      break;
    case 6:
      return ['saturday', 'sat'];
      break;
    default:
      return ['', ''];
 }
}

caseで条件を指定します。今回は曜日の指定なので、曜日の数字フォーマットを割り振ります。

そして、条件に合う曜日で配列をreturnします。

switch文は各条件(case)の最後にbreakを入れておきましょう。

switch文の動作はループと同じものらしく、条件に合ってもbreakがなければ最後まで実行してしまいます。

defaultは条件に合わない場合に、空の配列を返すようにしています。

これで分岐自体は問題ありませんが、変数に入れて返してません。

そこで、この値を使う行でlist()を使い、変数に入れてしまいます。

function test_fun(){
  //switchで分岐した値の取得
  list( $weekday_main, $weekday_sub ) = get_weekday_field_names();

//以下の関数の中で、$weekday_mainは配列の値1、$weekday_subは配列の値2で使える

と、こんな感じです。

これで実際に行数がかなり短縮できましたし、定義した行から少し離れたところで使うのも楽になりました。

よっぽどじゃなければif文の方が

と、今回は曜日による分岐だったので、簡単な条件でしたが。

文字列比較をする場合など、少し条件が複雑になる場合にはif文を使う方が良いみたいです。

自分はどちらかと言うと、コードを書きながらどんな動作なのかを確認しているところもあるので。

多少長くなるぐらいだったら、if文で書いた方が分かりやすいので。

まずはif文で書く事が多いですかね。

ただ、計算量はswitch文の方が少ないということもあり。

同じような動作の繰り返しなどの、単純な分岐を書くときには活用したいと思います。