PHP - 是否有一种简单的方法在两个日期之间循环并填写缺失值?

Jas*_*onS 4 php

我有2个约会.让我们说他们看起来像这样.

$start = 2010/12/24;
$end = 2012/01/05;
Run Code Online (Sandbox Code Playgroud)

我查询数据库以查找这两个日期之间的访问.我发现了一些.然后我填充一个名为stats的数组.

$stats['2010/12/25'] = 50;
$stats['2010/12/31'] = 25;
...
Run Code Online (Sandbox Code Playgroud)

如你所见,有几天不见了.我需要用零值填充缺失的日期.我在想这样的事情.(我已经从开始和结束日期开始提取日/月/年.

for($y=$start_year; $y <= $end_year; $y++) {
    for($m=$start_month; $m <=$end_month; $m++) {
        for($d=$start_day; $d <= $end_day; $d++) {
Run Code Online (Sandbox Code Playgroud)

这可以在一年中正常工作,但是几个月和几天都行不通.如果开始日是15日.将错过每个后续月份的第1-14天.我可以有这样的解决方案......

for($y=$start_year; $y <= $end_year; $y++) {
    for($m=1; $m <13; $m++) {
         $total_days = cal_days_in_month(CAL_GREGORIAN, $m, $y) + 1;
         for($d=1; $d <= $total_days; $d++) {
Run Code Online (Sandbox Code Playgroud)

然后,我需要一堆if语句,确保开始和结束的月份和日期都有效.

有没有更好的方法呢?或者甚至可以在我的mysql查询中完成?

Mar*_*ker 15

只是为了演示PHP的一些较新的间隔处理方法的功能(pgl在他的回答中提到):

$startDate = DateTime::createFromFormat("Y/m/d","2010/12/24",new DateTimeZone("Europe/London"));
$endDate = DateTime::createFromFormat("Y/m/d","2012/01/05",new DateTimeZone("Europe/London"));

$periodInterval = new DateInterval( "P1D" ); // 1-day, though can be more sophisticated rule
$period = new DatePeriod( $startDate, $periodInterval, $endDate );

foreach($period as $date){
   echo $date->format("Y-m-d") , PHP_EOL;
}
Run Code Online (Sandbox Code Playgroud)

是否需要PHP> = 5.3.0

编辑

如果您需要包含实际的结束日期,那么您需要在foreach()循环之前立即向$ endDate添加一天:

$endDate->add( $periodInterval );
Run Code Online (Sandbox Code Playgroud)

编辑#2

$startDate = new DateTime("2010/12/24",new DateTimeZone("Europe/London"));
$endDate = new DateTime("2012/01/05",new DateTimeZone("Europe/London"));

do {
   echo $startDate->format("Y-m-d") , PHP_EOL;
   $startDate->modify("+1 day");
} while ($startDate <= $endDate);
Run Code Online (Sandbox Code Playgroud)

对于PHP 5.2.0(如果启用了dateTime对象,则更早)