回答編集履歴
2
誤字修正
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
補足を追加
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文)の継続条件を「祝日のリストに含まれるか、または、土曜か日曜日に当たる」に変更する必要があるのでは。それなら、土日を遡る処理を別に書く必要もなくなる。
|