【问题标题】:How to convert last desired days to weeks in PHP如何在 PHP 中将最后所需的天数转换为周数
【发布时间】:2018-07-19 11:30:02
【问题描述】:

您好,我有一个函数可以返回当前日期后的最后 30 天,不包括当前日期。功能如下

function getLastNDays($days, $format = 'd-m-Y'){
    $m = date("m"); $de = date("d")-1; $y= date("Y");
    $dateArray = array();
    for($i=0; $i<=$days-1; $i++){

        $dateArray[] = date($format, mktime(0,0,0,$m,($de-$i),$y)); 
    }
    $dateArray[] = 'x';
    return array_reverse($dateArray);
}

所以我正在使用这个功能

$sevenarr = getLastNDays(30);

它正在返回这个结果

   Array
(
    [0] => x
    [1] => 19-06-2018
    [2] => 20-06-2018
    [3] => 21-06-2018
    [4] => 22-06-2018
    [5] => 23-06-2018
    [6] => 24-06-2018
    [7] => 25-06-2018
    [8] => 26-06-2018
    [9] => 27-06-2018
    [10] => 28-06-2018
    [11] => 29-06-2018
    [12] => 30-06-2018
    [13] => 01-07-2018
    [14] => 02-07-2018
    [15] => 03-07-2018
    [16] => 04-07-2018
    [17] => 05-07-2018
    [18] => 06-07-2018
    [19] => 07-07-2018
    [20] => 08-07-2018
    [21] => 09-07-2018
    [22] => 10-07-2018
    [23] => 11-07-2018
    [24] => 12-07-2018
    [25] => 13-07-2018
    [26] => 14-07-2018
    [27] => 15-07-2018
    [28] => 16-07-2018
    [29] => 17-07-2018
    [30] => 18-07-2018
)

所以我现在想要的是将结果天数显示为周数。所以直到现在我还无法弄清楚如何使用上层函数来做到这一点。请帮助我了解一些逻辑如何更新我的功能,以便我获得最后所需日期的几周。例如最后 30 天,它会将天转换为周

我想要的输出是

Array
(
    [0] => Array
        (
            ['start-date'] => 18-07-2018
            ['end-date'] => 12-07-2018
        )

    [1] => Array
        (
            ['start-date'] => 11-07-2018
            ['end-date'] => 5-07-2018
        )

     [2] => Array
        (
            ['start-date'] => 04-07-2018
            ['end-date'] => 28-06-2018
        )

    [3] => Array
        (
            ['start-date'] => 27-06-2018
            ['end-date'] => 21-06-2018
        )
    [4] => Array
        (
            ['start-date'] => 20-06-2018
            ['end-date'] => 19-06-2018
        )

想要的输出

 [weekArray] => Array
        (
            [1] => Array
                (
                    [0] => 2018-06-19
                    [1] => 2018-06-20
                    [2] => 2018-06-21
                    [3] => 2018-06-22
                    [4] => 2018-06-23
                    [5] => 2018-06-24
                    [6] => 2018-06-25
                )

            [2] => Array
                (
                    [0] => 2018-06-26
                    [1] => 2018-06-27
                    [2] => 2018-06-28
                    [3] => 2018-06-29
                    [4] => 2018-06-30
                    [5] => 2018-07-01
                    [6] => 2018-07-02
                )

            [3] => Array
                (
                    [0] => 2018-07-03
                    [1] => 2018-07-04
                    [2] => 2018-07-05
                    [3] => 2018-07-06
                    [4] => 2018-07-07
                    [5] => 2018-07-08
                    [6] => 2018-07-09
                )

            [4] => Array
                (
                    [0] => 2018-07-10
                    [1] => 2018-07-11
                    [2] => 2018-07-12
                    [3] => 2018-07-13
                    [4] => 2018-07-14
                    [5] => 2018-07-15
                    [6] => 2018-07-16
                )

            [5] => Array
                (

                    [0] => 2018-07-17
                    [1] => 2018-07-18
                    [2] => 2018-07-19
                )

        )

【问题讨论】:

  • 你能给我们一个预期输出的例子吗?

标签: php arrays datetime


【解决方案1】:

检查下面的函数以将天数范围变为数周。我认为星期天是一周的第一天。

    <?php
    function getLastNDays($days, $format = 'Y-m-d'){

        $retunData = array();

        $m = date("m"); $de = date("d")-1; $y= date("Y");
        $dateArray = array();
        for($i=0; $i<=$days-1; $i++){

            $dateArray[] = date($format, mktime(0,0,0,$m,($de-$i),$y)); 
        }
        //$dateArray[] = 'x';
        $resultArray =  array_reverse($dateArray);

        // After get the date Range find out Statrt & End date
        $start_date = $resultArray[0];
        $end_date = $resultArray[count($resultArray)-1];

        $from_date = new DateTime($start_date);
        $to_date = new DateTime($end_date);
        $interval = new DateInterval('P1D');
        $dateRange = new DatePeriod($from_date, $interval, $to_date);

        $week_number = 1;
        $weekArray = array();

        foreach ($dateRange as $key => $date) {
            $weekArray[$week_number][] = $date->format('Y-m-d');

            $mod = $key%7;
            if($mod == 6){
              $week_number++;
            }  

            /*
            if ($date->format('w') == 6) {
                $week_number++;
            }
            */
        }
        $retunData['weekArray'] = $weekArray;

        //Get the Start & End Date each week.   
        $weekrange = array_map(function($w) {
            return 'start: ' . array_shift($w) 
                . ', end: ' . array_pop($w); },
        $weekArray);

        $retunData['weekRange'] = $weekrange;

        return $retunData;
    }

    $retunData = getLastNDays(30);  // Call your custom function.

    echo '<pre>';
    print_r($retunData);
    exit;

    ?>

    Your Output will be as per the date range.



   Array
(
    [weekArray] => Array
        (
            [1] => Array
                (
                    [0] => 2018-06-20
                    [1] => 2018-06-21
                    [2] => 2018-06-22
                    [3] => 2018-06-23
                    [4] => 2018-06-24
                    [5] => 2018-06-25
                    [6] => 2018-06-26
                )

            [2] => Array
                (
                    [0] => 2018-06-27
                    [1] => 2018-06-28
                    [2] => 2018-06-29
                    [3] => 2018-06-30
                    [4] => 2018-07-01
                    [5] => 2018-07-02
                    [6] => 2018-07-03
                )

            [3] => Array
                (
                    [0] => 2018-07-04
                    [1] => 2018-07-05
                    [2] => 2018-07-06
                    [3] => 2018-07-07
                    [4] => 2018-07-08
                    [5] => 2018-07-09
                    [6] => 2018-07-10
                )

            [4] => Array
                (
                    [0] => 2018-07-11
                    [1] => 2018-07-12
                    [2] => 2018-07-13
                    [3] => 2018-07-14
                    [4] => 2018-07-15
                    [5] => 2018-07-16
                    [6] => 2018-07-17
                )

            [5] => Array
                (
                    [0] => 2018-07-18
                )

        )

    [weekRange] => Array
        (
            [1] => start: 2018-06-20, end: 2018-06-26
            [2] => start: 2018-06-27, end: 2018-07-03
            [3] => start: 2018-07-04, end: 2018-07-10
            [4] => start: 2018-07-11, end: 2018-07-17
            [5] => start: 2018-07-18, end: 
        )

)

【讨论】:

  • 感谢您的回答。让我检查一下它是否对我有用
  • 正如您在weekArray 的输出中所见。在第一个数组中只显示 5 个值。我想要的有七个希望你能得到我
  • 所以突然间我深入研究了一下,发现由于将星期日视为第一天,它会产生问题,有什么方法可以将第一个数组值视为一周的第一天从那里开始循环
  • 请检查更新的答案。您需要更新 foreach 循环。
猜你喜欢
  • 1970-01-01
  • 2019-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-07
  • 2014-04-29
  • 1970-01-01
相关资源
最近更新 更多