PHP显示一系列日期,不包括给定的假日和休息日
我想设置我的商店预购日期,这将是基于一系列天。假设我将5天设置为预订单,那么它将在当前日期的基础上增加5天,并显示在下拉列表中。但最重要的是会有假期和一些工作日关闭 假设今天是第14天,我定了5天,应该是这样的几天PHP显示一系列日期,不包括给定的假日和休息日,php,arrays,Php,Arrays,我想设置我的商店预购日期,这将是基于一系列天。假设我将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天是假期,商店在每周四和周六关门 因此,在这种情况下,商店将关闭 2
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);
$data=[];
函数get\u store\u open\u days($order\u range,$initial\u date){
$day=0;
$days=[];
$test=[];
$disable_weekdays=array('4','6');//周四和周六休息
$holidays=数组('2020-09-18','2020-09-15');
对于($i=0;$i您需要使用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;
}
结果
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)
如果希望从今天以外的日期开始,请使用第四个参数:
$days = getStoreOpenDays(5, $daysClosed, $holidays, '2020-10-01');
您需要使用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;
}
结果
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)
如果希望从今天以外的日期开始,请使用第四个参数:
$days = getStoreOpenDays(5, $daysClosed, $holidays, '2020-10-01');
@NadHorsie谢谢你的回答。虽然我已经接受了答案,但我还需要对特别开张日进行另一次修改。因此,你可以参考我更新的问题。你也能在这里帮助我吗?基本上,特别开张日是商店开张的日期。如果是在平日休息或节假日,商店仍然会开张在这些日子里营业。你能帮我吗?@NadHorsie谢谢你的回答。虽然我已经接受了答案,但我需要对特别营业日进行另一次修改。所以你可以参考我更新的问题。你也能帮我吗?基本上,特别营业日就是商店开业的日子。如果是在一周内休息日或节假日,商店仍将在这几天营业。你能帮我吗?