2016-01-15 25 views
0

我想创建一个函数来创建DateTime(s)的数组。我想要的日期是给定年份的每个星期六。PHP数组的DateTime似乎倾斜

我有这样做的功能,但是当值存储在一个数组中时,它们从一年的第二个周六开始,延伸到下一年的第一个周六。

请注意,以下内容显示了由函数生成的星期六列表,然后在几行空白行显示数组中的星期六商店后。

<?php 
define ('sql','Y-m-d'); 
define ('br','<br/>'); 

function allSaturdays ($year){ 
    $endofyear = "$year-12-31"; 
    $interval = new DateInterval("P7D"); 

    $year--; 
    $workingdate = "$year-12-31"; 

    $workingdate = strtotime ($workingdate); 
    $workingdate = strtotime ("next Saturday",$workingdate); 

    $workingdate = date ("Y-m-d",$workingdate); 
    $workingdate = new DateTime ($workingdate); 
    $result[] = new DateTime; 
    while ($workingdate->format(sql) <= $endofyear) { 
     $result[] = $workingdate; 
     echo $workingdate->format (sql).br;  
     $workingdate->add ($interval); 
     $workingdate = new DateTime ($workingdate->format(sql)); 
     //echo $workingdate->format (sql)."#".br;; 
    }// while 
     unset ($workingdate); 
     return $result; 

}//function 


    $sats = allSaturdays(2016); 

    echo "<br/.<br/>"; 
    foreach ($sats as $saturday) 
    echo $saturday->format(sql)."*<br>"; 


    ?> 

但是,如果我存储唯一的日期(2016-01-02)正确的值在数组中。

毫无疑问,我错过了一些简单的东西。任何帮助表示赞赏。

Dave

回答

3

在将数据放入数组后,您正在修改DateTime对象。

这是你将它添加到阵列:

$result[] = $workingdate; 

再经过该行增加了7天,它:

$workingdate->add($interval); 

调用添加修改原始。如果您想确保您正在处理副本,请先拨打克隆或使用DateTimeImmutable而不是DateTime

下面是使用DateTimeImmutable你的代码的新版本:

function allSaturdays ($year){ 

    $endOfYear = new DateTimeImmutable("$year-12-31"); 
    $workingdate = new DateTimeImmutable("first saturday of January " . $year); 

    while ($workingdate <= $endofyear) { 
     $result[] = $workingdate; 
     $workingDate = $workingDate->modify('+7 days'); 
    }// while 
    return $result; 

}//function 

这里的另一个版本,不使用DateTimeImmutable

function allSaturdays ($year){ 

    $endOfYear = new DateTime("$year-12-31"); 
    $workingdate = new DateTime("first saturday of January " . $year); 

    while ($workingdate <= $endofyear) { 
     $result[] = $workingdate; 
     $workingDate = clone $workingDate; 
     $workingDate->modify('+7 days'); 
    }// while 
    return $result; 

}//function 
+0

无限循环我。手动修正了一些通知 –

+0

完美 - 非常感谢 –