回答編集履歴

2

誤字修正

2021/09/13 19:58

投稿

Daregada
Daregada

スコア11990

test CHANGED
@@ -68,7 +68,7 @@
68
68
 
69
69
 
70
70
 
71
- ところで、「**月末の月曜日が祝日(あるいは月末から直近の月曜日までが連続して祝日)だと、最終営業日を得るには`exclude_holiday`の結果からさらに遡らないといけない」ことにそろそろ気がついたのでは。
71
+ ところで、「**月末の月曜日が祝日(あるいは月末から直近の月曜日までが連続して祝日)だと、最終営業日を得るには`exclude_holiday`の結果からさらに遡らないといけない**」ことにそろそろ気がついたのでは。
72
72
 
73
73
 
74
74
 

1

補足を追加

2021/09/13 19:58

投稿

Daregada
Daregada

スコア11990

test CHANGED
@@ -31,3 +31,47 @@
31
31
  - **再帰呼び出しが必要なのは、if文の条件が成立したときだけ**なので、`exclude_holiday`の呼び出しはif文の中に入れる。
32
32
 
33
33
  - 最初に実引数に指定した`$last_day_obj`が、(再帰呼び出しにおいても)直接書き替えられるので、返り値を返す必要はない。関数終了後、`$result = $last_day_obj->format('Y-m-d');`とすればいい。
34
+
35
+
36
+
37
+ ### 補足
38
+
39
+
40
+
41
+ > 再帰関数を使いこなせるようになりたいために、再帰処理をベースとする以下の処理でアドバイスを頂けると有難いです。
42
+
43
+
44
+
45
+ ということだったので再帰関数を使ったが、返り値を使わないのでわざわざ再帰させる意味がない。実際に書くとしたらwhileループを使う。たとえば、
46
+
47
+
48
+
49
+ ```PHP
50
+
51
+ function exclude_holiday($date_obj_arg, $holidays_arg)
52
+
53
+ {
54
+
55
+ while (in_array($date_obj_arg->format('Y-m-d'), $holidays_arg)) {
56
+
57
+ $date_obj_arg->modify('-1 day');
58
+
59
+ }
60
+
61
+ return;
62
+
63
+ }
64
+
65
+ ```
66
+
67
+ とすれば同じ結果が得られる。すなわち、呼び出すときの実引数に指定した`$last_day_obj`が指すDateTimeオブジェクトの内容が、祝日の間はwhileループで直接1日ずつ前に戻る。
68
+
69
+
70
+
71
+ ところで、「**月末の月曜日が祝日(あるいは月末から直近の月曜日までが連続して祝日)だと、最終営業日を得るには`exclude_holiday`の結果からさらに遡らないといけない」ことにそろそろ気がついたのでは。
72
+
73
+
74
+
75
+ 実際、**2019-04-28は日曜日なので、実際の最終営業日はさらに遡った2019-04-26になる**。
76
+
77
+ if文(あるいはwhile文)の継続条件を「祝日のリストに含まれるか、または、土曜か日曜日に当たる」に変更する必要があるのでは。それなら、土日を遡る処理を別に書く必要もなくなる。