実装したいこと
- 年
$yyyy
、月$m
を指定することで特定の西暦の月について、最終営業日を取得したいと考えております。 - ここでの最終営業日とは、「月末に最も近い日」&&「土日を含まず」「
&& $holidays
の休暇リストも含まない」条件を満たすものとします。 DateTimeクラス
を利用することでこれを実装しようと思っています。
【開発環境】
PHPのバージョン7.4.1
発生している問題
上記を実装するために、以下の通りコーディングを致しました。今回お尋ねしたいのは$results = exclude_holiday($get_date,$holidays);//here
で利用している自己定義の再帰関数です。
上記の実装の過程で一つ稀なケースが存在しエラーが発生することがわかりました。具体的には、prep($holidays);
の出力結果の通りなのですが2019-04-20
と2019-04-30
が不運にも連続しており、in_array
で一階検査するだけでmodify('-1 day')
するのでは不十分で、その結果を再帰的に検査していくことが必要であることがわかりました。
###ご質問
その前提でexclude_holiday()
を定義したのですが、無限ループしてうまく実装することができません。関数内部の再帰的なexclude_holidayの第一引数がおかしいとはわかっているのですが、どのように実装すればよいのかわからずアドバイスをいただけますと幸いです。
もちろん、目的を達成するために全く別のアプローチでの実装等もご指摘はあろうかと思いますが、再帰関数を使いこなせるようになりたいために、再帰処理をベースとする以下の処理でアドバイスを頂けると有難いです。*あくまで希望です。
php
1<?php 2ini_set('display_errors', "On"); 3 4$yyyy = 2019; 5$m = 4; 6 7$url = "https://holidays-jp.github.io/api/v1/{$yyyy}/date.json"; 8$json = file_get_contents($url); 9$json = mb_convert_encoding($json, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN');//文字化対応 10$holidays = array_keys(json_decode($json,true)); 11array_push($holidays,"{$yyyy}-01-02");//銀行休業日追加 12array_push($holidays,"{$yyyy}-01-03");//銀行休業日追加 13array_push($holidays,"{$yyyy}-12-31");//銀行休業日追加 14prep($holidays); 15/* 出力結果 16Array 17( 18 [0] => 2019-01-01 19 [1] => 2019-01-14 20 [2] => 2019-02-11 21 [3] => 2019-03-21 22 [4] => 2019-04-29 23 [5] => 2019-04-30 24 [6] => 2019-05-01 25 [7] => 2019-05-02 26 [8] => 2019-05-03 27 [9] => 2019-05-04 28 [10] => 2019-05-05 29 [11] => 2019-05-06 30 [12] => 2019-07-15 31 [13] => 2019-08-11 32 [14] => 2019-08-12 33 [15] => 2019-09-16 34 [16] => 2019-09-23 35 [17] => 2019-10-14 36 [18] => 2019-10-22 37 [19] => 2019-11-03 38 [20] => 2019-11-04 39 [21] => 2019-11-23 40 [22] => 2019-01-02 41 [23] => 2019-01-03 42 [24] => 2019-12-31 43) 44*/ 45 46$last_day = date('Y-m-d', strtotime("last day of {$yyyy}-{$m}")); //月の最終日 47$last_day_obj = new DateTime($last_day ); 48$w = $last_day_obj -> format('l'); 49$w === "Saturday" ? $last_day_obj -> modify('-1 day'):0; 50$w === "Sunday" ? $last_day_obj -> modify('-2 day'):0; 51$get_date = $last_day_obj -> format('Y-m-d'); 52var_dump($get_date); 53 54$results = exclude_holiday($get_date,$holidays);//here 55var_dump($results); 56 57function exclude_holiday($get_date_arg,$holidays_arg){ 58 if (in_array($get_date_arg,$holidays_arg)){ 59 $back_date = $get_date_arg->modify('-1 day'); 60 } 61 exclude_holiday($back_date,$holidays_arg); 62 return $back_date; 63} 64 65function prep($ary){ 66 echo "<pre>"; 67 print_r($ary); 68 echo "</pre>"; 69}
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/13 03:37
2021/09/13 04:38 編集
2021/09/13 08:22
2021/09/13 09:10
2021/09/13 15:40