日の範囲に基づいて、ストアの予約注文日を設定したいと思います。たとえば、5日間を先行予約として設定すると、現在の日付に5日間が追加され、ドロップダウンに表示されます。しかし、主なことは休日があり、いくつかの平日は休業するでしょう
今日は14日で5日としましょう。
2020-09-14 ( Todays Date ) + 5 days
2020-09-15
2020-09-16
2020-09-17
2020-09-18
2020-09-19
しかし、15、18のような休日の可能性があり、店は毎週木曜日と土曜日に休業します
その場合、店舗は近くにあります
2020-09-15, 2020-09-18 (because of holidays)
2020-09-17, 2020-09-19 (each Thursday and Saturday off)
しかし、ストアは5日間予約注文されているため、次のような最終日が表示されます。
2020-09-14
2020-09-16
2020-09-20
2020-09-21
2020-09-22
2020-09-23
だから、今のところ、私のコードはこのようなものです
$data = [];
function get_store_open_days( $order_range, $initial_date ) {
$day = 0;
$days = [];
$test = [];
$disable_weekdays = array( '4', '6' ); //thursday and saturdays off
$holidays = array( '2020-09-18', '2020-09-15' );
for ( $i=0; $i <= $order_range ; $i++ ) {
$days[] = date( 'Y-m-d', strtotime( $initial_date . ' + '.$i.' days' ) );
}
$weekdays_count = 0;
$holiday_count = 0;
$holiday_dates = [];
$disabled_weekdays = [];
if ( is_array( $days ) && !empty( $days ) ){
foreach( $days as $day ) {
if ( in_array( $day, $holidays ) ) {
$holiday_dates[] = $day;
}
//weekdays count
$day_number = date( 'N', strtotime( $day ) );
if ( in_array( $day_number, $disable_weekdays ) ) {
$disabled_weekdays[] = $day;
}
}
}
$disabled_weekdays = array_merge( $holiday_dates, $disabled_weekdays );
$open_days = array_diff( $days, $disabled_weekdays );
$open_buisness_days[] = $open_days;
$open_days_count = $order_range - count( $open_days );
if ( $open_days_count !== 0 ) {
$last_open_days = end( $open_days );
get_store_open_days( $open_days_count, $last_open_days );
$test[] = $open_buisness_days;
}
else {
$test[] = $open_buisness_days;
// print_r($open_buisness_days);
}
$data[] = $test;
return $data;
}
//current date
$initial_date = date( 'Y-m-d' );
//Get preorder range
$order_range = 5;
$get_store_days = get_store_open_days( $order_range, $initial_date );
print_r($get_store_days);
しかし、それは望ましい結果を得ていません。誰かがこれを調べて、私が間違っているところを助けてもらえますか?
while
条件を使用して、配列内の目的の日数が得られるまでループが継続することを確認する必要があります。
また、すべてのパラメーターを渡すことをお勧めします。関数にパラメーターをハードコーディングしないでください。
function getStoreOpenDays($preorder = 0, $excludeDays = [], $holidays = [], $initialDate = 'now') {
$days = [];
$daysRequired = $preorder + 1;
foreach ($holidays as $i => $date) {
$holidays[$i] = (new DateTime($date))->format('Ymd');
}
$start = new DateTimeImmutable($initialDate);
$i = 0;
while (count($days) < $daysRequired) {
$day = $start->add(new DateInterval('P' . $i++ . 'D'));
$isExcluded = in_array($day->format('N'), $excludeDays);
$isHoliday = in_array($day->format('Ymd'), $holidays);
if (!$isExcluded && !$isHoliday) {
$days[] = $day;
}
}
return $days;
}
使用法
// Exclude Thursdays and Saturdays
$daysClosed = [4, 6];
// Set the holiday dates
$holidays = ['2020-09-15', '2020-09-18'];
// Get an array of date objects for the next 5 preorder days
$days = getStoreOpenDays(5, $daysClosed, $holidays);
結果
Array
(
[0] => DateTimeImmutable Object
(
[date] => 2020-09-14 09:27:20.000000
[timezone_type] => 3
[timezone] => US/Pacific
)
[1] => DateTimeImmutable Object
(
[date] => 2020-09-16 09:27:20.000000
[timezone_type] => 3
[timezone] => US/Pacific
)
[2] => DateTimeImmutable Object
(
[date] => 2020-09-20 09:27:20.000000
[timezone_type] => 3
[timezone] => US/Pacific
)
[3] => DateTimeImmutable Object
(
[date] => 2020-09-21 09:27:20.000000
[timezone_type] => 3
[timezone] => US/Pacific
)
[4] => DateTimeImmutable Object
(
[date] => 2020-09-22 09:27:20.000000
[timezone_type] => 3
[timezone] => US/Pacific
)
[5] => DateTimeImmutable Object
(
[date] => 2020-09-23 09:27:20.000000
[timezone_type] => 3
[timezone] => US/Pacific
)
)
その他の注意事項
その後、必要に応じて日付オブジェクトを操作できます。
foreach ($days as $day) {
echo $day->format('Y-m-d (l)') . "\n";
}
出力:
2020-09-14 (Monday)
2020-09-16 (Wednesday)
2020-09-20 (Sunday)
2020-09-21 (Monday)
2020-09-22 (Tuesday)
2020-09-23 (Wednesday)
今日以外の日付で開始する場合は、4番目のパラメーターを使用します。
$days = getStoreOpenDays(5, $daysClosed, $holidays, '2020-10-01');
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加