Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP显示一系列日期,不包括给定的假日和休息日_Php_Arrays - Fatal编程技术网

PHP显示一系列日期,不包括给定的假日和休息日

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

我想设置我的商店预购日期,这将是基于一系列天。假设我将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);
$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谢谢你的回答。虽然我已经接受了答案,但我需要对特别营业日进行另一次修改。所以你可以参考我更新的问题。你也能帮我吗?基本上,特别营业日就是商店开业的日子。如果是在一周内休息日或节假日,商店仍将在这几天营业。你能帮我吗?