【问题标题】:php array with date group by week saturday till friday带有日期组的 php 数组,按周周六到周五
【发布时间】:2018-01-10 20:53:25
【问题描述】:

我有一个包含项目的数组。每个项目都有一个标题和开始日期。现在我想按周对这些项目进行分组。如果我查看文档,格式->('W') 周从星期一开始。我需要把这个改成星期六。

        $items = [
        [   // friday
            'title'     => 'test',
            'startdate' => '2016-03-18',    // first group
        ],
        [   // saturday
            'title'     => 'test',
            'startdate' => '2016-03-19', // second group
        ],
        [   // sunday
            'title'     => 'test',
            'startdate' => '2016-03-20', // second group
        ],
        [   // monday
            'title'     => 'test',
            'startdate' => '2016-03-21', // second group
        ],
        [   // saterday
            'title'     => 'test',
            'startdate' => '2016-03-26', // third group
        ],
    ];

我有这样的东西,但它不能正常工作

        foreach($items as $item) {
            // group by week
            $startDate      =  \DateTime::createFromFormat('Y-m-d', $item['startdate']);
            $currectWeek    = $startDate->format('W');
            $saturday       = 6;
            $friday         = 5;

            $test = clone $startDate;

            if($currectWeek !== 5){
                $test->modify('last friday');
            }

            if($currectWeek !== 6){
                $test->modify('next saturday');
            }

            $a = $test->format('W');

            if(!isset($items_by_week[$a])){
                $items_by_week[$a] = [];
            }

            $items_by_week[$a][] = [
                'title'    => $item['title'],
                'date'     => $item['startdate'],
            ];
        }

【问题讨论】:

  • 什么不起作用?我看到您的 $items_by_week 数组按周数分组。请让我们知道您正在寻找提供的示例输入的示例输出
  • 我用下面的答案解决了这个问题:stackoverflow.com/questions/13128854/…

标签: php sorting date range


【解决方案1】:

试试下面的代码

$startDate = \DateTime::createFromFormat('Y-m-d', $item['startdate']);
$week = intval($startDate->format('W'));
$day = intval($startDate->format('N'));

$a = ($day < 6 ) ? $week-1 : $week;

【讨论】:

  • 我怎么能同时考虑到不同的年份
  • 这取决于从新年开始算起第一周的最少天数。在 min = 4 的情况下,我的代码将工作,因为 DateTime 在 php 中的实现
【解决方案2】:

按周分组(每周从星期六开始到星期五结束)。这是结果,使用以下代码:

$byWeek = array(); 
foreach ($items as $item) {
    $date = DateTime::createFromFormat('Y-m-d', $item['date']);

    $firstDayOfWeek = 6; // Saturday

    $difference = ($firstDayOfWeek - $date->format('N'));
    if ($difference > 0) { $difference -= 7; }
    $date->modify("$difference days");
    $week = $date->format('W');

    if(!isset($byWeek[$week])){
        $byWeek[$week] = [];
    }

    $byWeek[$week][] = $item;
}

// result
        Array
        (

        [31] => Array
            (
                [0] => Array
                    (
                        [title] => test 11
                        [date] => 2017-08-11
                    )

            )

        [32] => Array
            (
                [0] => Array
                    (
                        [title] => test
                        [date] => 2017-08-12
                    )

                [1] => Array
                    (
                        [title] => test 222
                        [date] => 2017-08-12
                    )

                [2] => Array
                    (
                        [title] => test 1
                        [date] => 2017-08-13
                    )

                [3] => Array
                    (
                        [title] => test 2
                        [date] => 2017-08-14
                    )

            )

但现在我也想在一周内按天分组。所以需要类似下面的输出

Array
(
    [32] => Array
        (
            [0] => Array
                (
                    [0] => Array
                        (
                            [title] => test
                            [date] => 2017-08-12
                        )

                    [1] => Array
                        (
                            [title] => test 222
                            [date] => 2017-08-12
                        )

                )

            [1] => Array
                (
                    [title] => test 1
                    [date] => 2017-08-13
                )

        )

)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-11
    • 2021-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多