【问题标题】:PHP function to retrive days between two dates group by yearPHP函数按年份检索两个日期之间的天数
【发布时间】:2018-11-27 14:16:09
【问题描述】:

我需要一个 PHP 函数来返回一个多维数组,以便在日期之间有每年的天数:

Es:

daysinyears('17-06-2012', '28-07-2018')

必须返回这个数组:

Array ( [0] => Array ([year] => 2018, [days] => 208),
        [1] => Array ([year] => 2017, [days] => 364),
        [2] => Array ([year] => 2016, [days] => 365),
        [3] => Array ([year] => 2015, [days] => 364),
        [4] => Array ([year] => 2014, [days] => 364),
        [5] => Array ([year] => 2013, [days] => 365),
        [6] => Array ([year] => 2012, [days] => 197)
      )

这就是我所做的;

function daysinyears($d1, $d2) {
      // swap dates if wrong order
      if ($d1 > $d2) {
        $aux = $d1;
        $d1 = $d2;
        $d2 = $aux;
      }
      // if same year, just count days with date_diff
      if ($d1->format("Y") == $d2->format("Y")) {
        $days_year = array('year' => $d1->format("Y"), 
                             'days' => date_diff($d2, $d1)->format('%a'));
        $arr[] = $days_year;


      } else {
        $days_year = array('year' => $d2->format("Y"), 
                             'days' => date_diff($d2, date_create(date('d-m-Y',strtotime('01-01-'.$d2->format("Y")))))->format('%a'));
        $arr[] = $days_year;
        $year_prec = $d2->format("Y")-1;
        // Recursion
        $arr[] = daysinyears($d1, date_create(date('d-m-Y',strtotime('31-12-'.$year_prec))));
      }
      return $arr;
}

它“有效”,但问题是递归在另一个内部创建了一个数组,如下所示:

[0] => Array (
    [year] => 2018
    [days] => 208
    )
[1] => Array (
    [0] => Array (
        [year] => 2017
        [days] => 364
        )
    [1] => Array (
        [0] => Array (
            [year] => 2016
            [days] => 365
            )
        [1] => Array (
            [0] => Array (
                [year] => 2015
                [days] => 364
                )
            [1] => Array (
                [0] => Array (
                    [year] => 2014
                    [days] => 364
                    )
                [1] => Array (
                    [0] => Array (
                        [year] => 2013
                        [days] => 364
                        )
                    [1] => Array (
                        [0] => Array (
                            [year] => 2012
                            [days] => 197
                            )
                        )
                    )
                )
            )
        )
    )

如果不返回这些中文框,我无法理解如何使用递归。

【问题讨论】:

  • 现在您必须使用 foreach 访问这些中文框:D

标签: php date recursion multidimensional-array


【解决方案1】:

不要将递归结果与$arr[] =相加,而是将其与$arr = array_merge($arr, ...)合并:

$arr = array_merge($arr, daysinyears($d1, date_create(date('d-m-Y',strtotime('31-12-'.$year_prec)))));

【讨论】:

    【解决方案2】:

    我认为您的计算存在错误,因为 2018 年的总天数应该是 178 而不是 208。我还认为您可以使用更清晰的解决方案,例如:

    function daysInYears($start, $end)
    {
        $result = [];
    
        $start = new DateTime($start);
        $end = new DateTime($end);
    
        while ($start < $end) {
    
            $endOfYear = (clone $start)->modify('last day of december');
    
            if ($endOfYear > $end) {
                $endOfYear = $end;
            }
    
            $result[] = [
                'year' => $start->format('Y'),
                'days' => $endOfYear->diff($start)->days
            ];
    
            $start = $endOfYear->modify('+1 day');
        }
    
        return $result;
    }
    

    daysInYears('17-06-2012', '28-06-2018') 的结果是:

    Array
    (
        [0] => Array
            (
                [year] => 2012
                [days] => 197
            )
    
        [1] => Array
            (
                [year] => 2013
                [days] => 364
            )
    
        [2] => Array
            (
                [year] => 2014
                [days] => 364
            )
    
        [3] => Array
            (
                [year] => 2015
                [days] => 364
            )
    
        [4] => Array
            (
                [year] => 2016
                [days] => 365
            )
    
        [5] => Array
            (
                [year] => 2017
                [days] => 364
            )
    
        [6] => Array
            (
                [year] => 2018
                [days] => 178
            )
    
    )
    

    【讨论】:

    • 函数是对的,例子中第二个日期写错了:现在是28-7-2018是对的
    【解决方案3】:

    您可以通过在参数上传递 sl 来解决问题。

    function daysinyears($d1, $d2 , $sl) {
      // swap dates if wrong order
      if ($d1 > $d2) {
        $aux = $d1;
        $d1 = $d2;
        $d2 = $aux;
      }
      // if same year, just count days with date_diff
      if ($d1->format("Y") == $d2->format("Y")) {
        $days_year = array('year' => $d1->format("Y"), 
                             'days' => date_diff($d2, $d1)->format('%a'));
        $arr[$sl] = $days_year;
    
    
      } else {
        $days_year = array('year' => $d2->format("Y"), 
                             'days' => date_diff($d2, date_create(date('d-m-Y',strtotime('01-01-'.$d2->format("Y")))))->format('%a'));
        $arr[$sl] = $days_year;
        $year_prec = $d2->format("Y")-1;
        // Recursion
        $arr[$sl] = daysinyears($d1, date_create(date('d-m-Y',strtotime('31-12-'.$year_prec))),$sl++);
      }
      return $arr;
    
    
    }
    

    在调用函数的地方设置参数0

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-24
      相关资源
      最近更新 更多