PHPは、指定された一連の休日と休日を除いて、日付の範囲を表示します

新しいユーザー:

日の範囲に基づいて、ストアの予約注文日を設定したいと思います。たとえば、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);

しかし、それは望ましい結果を得ていません。誰かがこれを調べて、私が間違っているところを助けてもらえますか?

BadHorsie:

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]

編集
0

コメントを追加

0

関連記事

分類Dev

SQLiteは、日曜日と一部の休日を含まない範囲内の日付を選択します

分類Dev

指定された日付範囲の最大値を取得し、日ごとにグループ化しますPHP MYSQL

分類Dev

日付の範囲から休日の日付を削除する方法

分類Dev

指定された日付範囲に基づいて月曜日と日曜日を取得します

分類Dev

momentjs形式は休日の日付を返しますか?

分類Dev

lubridateは1日休みの日付を解析します

分類Dev

休日と曜日に基づいて日付を設定しますか?

分類Dev

指定された日付範囲のすべての日付を変数に格納します

分類Dev

指定された日付範囲のすべての日付を変数に格納します

分類Dev

休日の日付を除く日付配列に2営業日を追加します

分類Dev

指定された日付範囲から週の日付範囲を取得します

分類Dev

日付が休日の場合は、日付が休日でなくなるまで日付に日を追加します

分類Dev

日付範囲を展開して、除外された日付のテーブルから一連の日付範囲の間のすべての日付を取得します

分類Dev

休日分類子を日付のリストに割り当てようとしています

分類Dev

SUMPRODUCT数式は、指定された範囲内の一部の日付のみをカウントしています

分類Dev

今日の日付が含まれている場合は、日付範囲を強調表示します

分類Dev

Python Pandasのデータフレームの日付に基づいて、次の休日から最後の休日までの日数を計算しますか?

分類Dev

休日を除くJavascriptの2つの日付間の稼働日を計算します

分類Dev

Elasticsearchの日付範囲は、日付範囲のネストされた配列をチェックします

分類Dev

SQL DB2で休日、例外、および週末をスキップして、指定された日付にN営業日を追加します

分類Dev

週末に当たる休日を除く、2つの日付の間のすべての休日をカウントする方法-Excel

分類Dev

指定された日付範囲のSQLサーバーから最大日付と最大日付から正確な前を取得します

分類Dev

作成者の日付の指定された日付範囲のコミットをgitに表示させる方法は?

分類Dev

Elixir-指定された日付範囲で日付が重複しているアイテムのリストをフィルタリングします

分類Dev

php datetimeは、既存の日付を使用して、日が追加された新しい日付を作成します

分類Dev

定義されたルールに従って、休日を除く平日の日付のリストを生成する方法

分類Dev

一連の日付範囲が指定されたPostgreSQLクエリ

分類Dev

指定された範囲(開始日と終了日)の日付のリストを返すSpring Data JPA

分類Dev

Androidで現在の日付と現在の日から7日を取得する方法は?画像で指定された以下の形式で日付を表示したい

Related 関連記事

  1. 1

    SQLiteは、日曜日と一部の休日を含まない範囲内の日付を選択します

  2. 2

    指定された日付範囲の最大値を取得し、日ごとにグループ化しますPHP MYSQL

  3. 3

    日付の範囲から休日の日付を削除する方法

  4. 4

    指定された日付範囲に基づいて月曜日と日曜日を取得します

  5. 5

    momentjs形式は休日の日付を返しますか?

  6. 6

    lubridateは1日休みの日付を解析します

  7. 7

    休日と曜日に基づいて日付を設定しますか?

  8. 8

    指定された日付範囲のすべての日付を変数に格納します

  9. 9

    指定された日付範囲のすべての日付を変数に格納します

  10. 10

    休日の日付を除く日付配列に2営業日を追加します

  11. 11

    指定された日付範囲から週の日付範囲を取得します

  12. 12

    日付が休日の場合は、日付が休日でなくなるまで日付に日を追加します

  13. 13

    日付範囲を展開して、除外された日付のテーブルから一連の日付範囲の間のすべての日付を取得します

  14. 14

    休日分類子を日付のリストに割り当てようとしています

  15. 15

    SUMPRODUCT数式は、指定された範囲内の一部の日付のみをカウントしています

  16. 16

    今日の日付が含まれている場合は、日付範囲を強調表示します

  17. 17

    Python Pandasのデータフレームの日付に基づいて、次の休日から最後の休日までの日数を計算しますか?

  18. 18

    休日を除くJavascriptの2つの日付間の稼働日を計算します

  19. 19

    Elasticsearchの日付範囲は、日付範囲のネストされた配列をチェックします

  20. 20

    SQL DB2で休日、例外、および週末をスキップして、指定された日付にN営業日を追加します

  21. 21

    週末に当たる休日を除く、2つの日付の間のすべての休日をカウントする方法-Excel

  22. 22

    指定された日付範囲のSQLサーバーから最大日付と最大日付から正確な前を取得します

  23. 23

    作成者の日付の指定された日付範囲のコミットをgitに表示させる方法は?

  24. 24

    Elixir-指定された日付範囲で日付が重複しているアイテムのリストをフィルタリングします

  25. 25

    php datetimeは、既存の日付を使用して、日が追加された新しい日付を作成します

  26. 26

    定義されたルールに従って、休日を除く平日の日付のリストを生成する方法

  27. 27

    一連の日付範囲が指定されたPostgreSQLクエリ

  28. 28

    指定された範囲(開始日と終了日)の日付のリストを返すSpring Data JPA

  29. 29

    Androidで現在の日付と現在の日から7日を取得する方法は?画像で指定された以下の形式で日付を表示したい

ホットタグ

アーカイブ