获得数年数月数的最有效方法

Posted

技术标签:

【中文标题】获得数年数月数的最有效方法【英文标题】:Most efficient way to get array of months in array of years 【发布时间】:2013-02-27 20:36:42 【问题描述】:

获取从指定日期到现在按年份分组的月份数组的最有效方法是什么。

例如 getMonths("August 2012") 将输出

array(
    array("Year"=>"2013", "months" = array(
         "February", "January")
    ),
    array("Year"=>"2012", "months" = array(
         "December", "November","October", "September", "August")
    )
)

到目前为止,我得到了:

$start = strtotime('2012-08-01');
$end = time();
$month = $start;
$months[] = date('F', $start);
while($month <= $end) 
  $month = strtotime("+1 month", $month);
  $months[] = date('F', $month);

这是输出正确的月份,但没有将它们分组为年份。 谢谢

【问题讨论】:

【参考方案1】:

你可以试试

function getMonths($month,$count = 1) 
    $now = new DateTime();
    $start = DateTime::createFromFormat("F Y", $month);
    $list = array();
    $interval = new DateInterval(sprintf("P%dM",$count));
    while ( $start <= $now ) 
        $list[$start->format("Y")][] = $start->format("F");
        $start->add($interval);
    
    return $list;


print_r(getMonths("August 2012"));

输出

Array
(
    [2012] => Array
        (
            [0] => August
            [1] => September
            [2] => October
            [3] => November
            [4] => December
        )

    [2013] => Array
        (
            [0] => January
            [1] => February
        )

)

【讨论】:

【参考方案2】:

由于此处发布的答案对我不起作用(确定还尝试了在线沙箱),我编写了一个适用于大多数 php 版本的方法:

function getMonths($monat, $year) 
        $list = array();
        for(;$monat <= 12;$monat++) 
            if($year == date("Y") && $monat == date("m"))      // exit on current month+year
                break;
            
            if(!isset($list[ $year ])) 
                $list[ $year ] = array();
            
            $list[ $year ][ str_pad($monat, 2, '0', STR_PAD_LEFT) ] = date("F", strtotime('01.' . $monat . '.' . $year));

            if($monat == 12) 
                $monat = 0;
                $year++;
            
        
        return $list;
    

【讨论】:

以上是关于获得数年数月数的最有效方法的主要内容,如果未能解决你的问题,请参考以下文章

获得最近目标的最有效方法是啥

获得所有组合的最有效方法是啥? [复制]

发出类型声明的最有效方法是啥?

从 Django Queryset 获取值列表的最有效方法

为多边形轮廓绘制圆的最有效方法

计算服务面积的最有效方法 Asp.net + SQL Server