0

すべての週を保存するある種のループが必要であり、毎週の営業日が必要Mon-Friです。

$ year = date('Y');

$ firstDayOfJan = date( "Ymd"、strtotime("1月の最初の日{$year}"));

1月の初日から始まり、すべての週を与えるループをどのように設定しますか。探している出力は次のとおりです。

例:2013年1月の初日は火曜日です。ループを実行した後、最初の週は次のようになります。

1週目->FROM:01-01-2013(TUEADAY FIRST DAY)TO:01-04-2013(FRIDAY)

2週目->開始日:2013年1月7日(月曜日)終了日:2013年1月11日(金曜日)

...月曜日から金曜日までのすべての週に


または、別の種類のSource / Delrefで言い換えると:


現在の週から過去の週を取得し、PHP間のすべての営業日を取得します

今週から過去のすべての週を取得したい。

$ currYear = date( "Y");

$ currDate = date( "mdY"、time()); //現在の日付を取得します

for($ i = $ currDate; $ i> 01-01-$ currYear; $ i-)(今年の1月の最初))すべての週を印刷

今週から始めて、過去のすべての週をバックトラックして取得したいと思います。したがって、7月中旬の場合は、7月から1月1日までのすべての週を表示できるようにしたいと思います。

週の形式は次のようにする必要があります。

第1週(1月):FROM:日付からTO:日付まで

助けてくれてありがとう

4

1 に答える 1

4

私が正しく数えれば、2013年には53週間を考慮する必要があります。

  1. 01週目->FROM:2013-01-01(火曜日)TO:2013-01-04(金曜日)
  2. 02週目->FROM:2013-01-07(月曜日)TO:2013-01-11(金曜日)
  3. 03週目->FROM:2013-01-14(月曜日)TO:2013-01-18(金曜日)
  4. 04週目->FROM:2013-01-21(月曜日)TO:2013-01-25(金曜日)
  5. 05週目->FROM:2013-01-28(月曜日)TO:2013-02-01(金曜日)
  6. 06週目->FROM:2013-02-04(月曜日)TO:2013-02-08(金曜日)
  7. 07週目->FROM:2013-02-11(月曜日)TO:2013-02-15(金曜日)
  8. 08週目->FROM:2013-02-18(月曜日)TO:2013-02-22(金曜日)
  9. 09週目->FROM:2013-02-25(月)TO:2013-03-01(金)
  10. 10週目->FROM:2013-03-04(月曜日)TO:2013-03-08(金曜日)
  11. 11週目->FROM:2013-03-11(月曜日)TO:2013-03-15(金曜日)
  12. 12週目->FROM:2013-03-18(月曜日)TO:2013-03-22(金曜日)
  13. 13週目->FROM:2013-03-25(月曜日)TO:2013-03-29(金曜日)
  14. 14週目->FROM:2013-04-01(月曜日)TO:2013-04-05(金曜日)
  15. 15週目->FROM:2013-04-08(月曜日)TO:2013-04-12(金曜日)
  16. 16週目->FROM:2013-04-15(月曜日)TO:2013-04-19(金曜日)
  17. 17週目->FROM:2013-04-22(月曜日)TO:2013-04-26(金曜日)
  18. 18週目->FROM:2013-04-29(月曜日)TO:2013-05-03(金曜日)
  19. 19週目->FROM:2013-05-06(月曜日)TO:2013-05-10(金曜日)
  20. 20週目->FROM:2013-05-13(月曜日)TO:2013-05-17(金曜日)
  21. 21週目->FROM:2013-05-20(月曜日)TO:2013-05-24(金曜日)
  22. 22週目->FROM:2013-05-27(月曜日)TO:2013-05-31(金曜日)
  23. 23週目->FROM:2013-06-03(月曜日)TO:2013-06-07(金曜日)
  24. 24週目->FROM:2013-06-10(月曜日)TO:2013-06-14(金曜日)
  25. 25週目->FROM:2013-06-17(月曜日)TO:2013-06-21(金曜日)
  26. 26週目->FROM:2013-06-24(月曜日)TO:2013-06-28(金曜日)
  27. 27週目->FROM:2013-07-01(月曜日)TO:2013-07-05(金曜日)
  28. 28週目->FROM:2013-07-08(月曜日)TO:2013-07-12(金曜日)
  29. 29週目->FROM:2013-07-15(月曜日)TO:2013-07-19(金曜日)
  30. 30週目->FROM:2013-07-22(月曜日)TO:2013-07-26(金曜日)
  31. 31週目->FROM:2013-07-29(月曜日)TO:2013-08-02(金曜日)
  32. 32週目->FROM:2013-08-05(月曜日)TO:2013-08-09(金曜日)
  33. 33週目->FROM:2013-08-12(月曜日)TO:2013-08-16(金曜日)
  34. 34週目->FROM:2013-08-19(月曜日)TO:2013-08-23(金曜日)
  35. 35週目->FROM:2013-08-26(月曜日)TO:2013-08-30(金曜日)
  36. 36週目->FROM:2013-09-02(月曜日)TO:2013-09-06(金曜日)
  37. 37週目->FROM:2013-09-09(月曜日)TO:2013-09-13(金曜日)
  38. 38週目->FROM:2013-09-16(月曜日)TO:2013-09-20(金曜日)
  39. 39週目->FROM:2013-09-23(月曜日)TO:2013-09-27(金曜日)
  40. 40週目->FROM:2013-09-30(月曜日)TO:2013-10-04(金曜日)
  41. 41週目->FROM:2013-10-07(月曜日)TO:2013-10-11(金曜日)
  42. 42週目->FROM:2013-10-14(月曜日)TO:2013-10-18(金曜日)
  43. 43週目->FROM:2013-10-21(月曜日)TO:2013-10-25(金曜日)
  44. 44週目->FROM:2013-10-28(月曜日)TO:2013-11-01(金曜日)
  45. 45週目->FROM:2013-11-04(月曜日)TO:2013-11-08(金曜日)
  46. 46週目->FROM:2013-11-11(月曜日)TO:2013-11-15(金曜日)
  47. 47週目->FROM:2013-11-18(月曜日)TO:2013-11-22(金曜日)
  48. 48週目->FROM:2013-11-25(月曜日)TO:2013-11-29(金曜日)
  49. 49週目->FROM:2013-12-02(月曜日)TO:2013-12-06(金曜日)
  50. 50週目->FROM:2013-12-09(月曜日)TO:2013-12-13(金曜日)
  51. 51週目->FROM:2013-12-16(月曜日)TO:2013-12-20(金曜日)
  52. 52週目->FROM:2013-12-23(月曜日)TO:2013-12-27(金曜日)
  53. 01週目->FROM:2013-12-30(月曜日)TO:2013-12-31(火曜日)

あなたはクラスを利用することによってそのようなリストを得ることができますDatePeriod、それはかなり柔軟です。

私はそれを次のように行いました(擬似コード):

for each $monday [
    in the period starting from the first day of the first week of 2013 
    with an interval of one week
    until 2013-12-31 23:59:59
] do: {
    output "X. Week XX --> "
    for each $day [
        in the period starting from $monday
        with an interval of one day
        repeated four times
    ] | [
        filter all days not having the year 
    ] | [
        filter out the first and last
    ] {
        output 
            "FROM" if has next "TO" otherwise
            ": " format($date, "Y-m-d (l)")
    }
}

このコードが示すように、私はイテレータを使用してこれを解決しました。DatePeriodはすでにトラバース可能DatePeriodYearFilterですが、特定の年の日付をフィルタリングする必要もありました(を参照FilterIteratorしてください。FirstAndLastIteratorこれは、基本的にはの拡張CachingIteratorです。

サンプルコード:

$year = 2013;

$weeksPeriod = new DatePeriod(
    new DateTime("$year-W01-1"),
    new DateInterval('P1W'),
    new DateTime("$year-12-31T23:59:59Z")
);

foreach ($weeksPeriod as $week => $monday) {

    $daysPeriod   = new DatePeriod($monday, new DateInterval('P1D'), 4);
    $daysFiltered = new DatePeriodYearFilter($daysPeriod, $year);
    $days         = new FirstAndLastIterator($daysFiltered);

    printf(" 1. Week %s --> ", $monday->format('W'));

    foreach ($days as $day => $date) {
        $label = $days->hasNext() ? 'FROM' : 'TO';
        printf("%s: %s ", $label, $date->format('Y-m-d (l)'));
    }

    echo "\n";
}

PHP 5.5の今後のジェネレーター機能を利用すると、開始日と終了日がない週を非常に簡単にフィルターで除外できるため、これらすべてを、毎週FROMでのみ返されるイテレーターにラップします(if利用可能)およびTO日付。

PHP 5.4では、これは配列変換を使用してシミュレートできますが、これはそれほど多くのエントリではないため、これも問題ないようです。ここにサンプルコードがあります:

$workdaysOfWeekForMonday = function(DateTime $monday) use ($year) {

    $daysPeriod   = new DatePeriod($monday, new DateInterval('P1D'), 4);
    $daysFiltered = new DatePeriodYearFilter($daysPeriod, $year);
    $days         = new FirstAndLastIterator($daysFiltered);

    return array_map(function(DateTime $date) {return $date->format('Y-m-d (l)');}, iterator_to_array($days, false));
};

$result = array_filter(array_map($workdaysOfWeekForMonday, iterator_to_array($weeksPeriod)));

print_r($result);

結果(短縮された、ここでは2017年の模範的であり、実際には先週は平日は稼働していなかったはずであり、現在は適切にフィルタリングされています):

Array
(
    [0] => Array
        (
            [0] => 2017-01-02 (Monday)
            [1] => 2017-01-06 (Friday)
        )

    [1] => Array
        (
            [0] => 2017-01-09 (Monday)
            [1] => 2017-01-13 (Friday)
        )

    [2] => Array
        (
            [0] => 2017-01-16 (Monday)
            [1] => 2017-01-20 (Friday)
        )

    ...

    [49] => Array
        (
            [0] => 2017-12-11 (Monday)
            [1] => 2017-12-15 (Friday)
        )

    [50] => Array
        (
            [0] => 2017-12-18 (Monday)
            [1] => 2017-12-22 (Friday)
        )

    [51] => Array
        (
            [0] => 2017-12-25 (Monday)
            [1] => 2017-12-29 (Friday)
        )

)

そして、ここに、これらの例のために追加したイテレータのコードがあります:Gist

于 2013-01-03T21:31:28.137 に答える