在PHP中的日期数组中填充空日期

在PHP中的日期数组中填充空日期,php,arrays,Php,Arrays,我在codeigniter中有一个数组,如下所示。如下所示,日期之间有一些空格。4月1日之后是第3天,之后是第10天,依此类推 Array ( [2019-04-01] => 1 [2019-04-03] => 3 [2019-04-10] => 8 [2019-04-15] => 1 ) 我需要这些空日期的值为'0',因此最后,数组将如下所示: Array

我在codeigniter中有一个数组,如下所示。如下所示,日期之间有一些空格。4月1日之后是第3天,之后是第10天,依此类推

 Array
    (
        [2019-04-01] => 1
        [2019-04-03] => 3
        [2019-04-10] => 8
        [2019-04-15] => 1
    )
我需要这些空日期的值为
'0'
,因此最后,数组将如下所示:

    Array
            (
       [2019-04-01] => 1
       [2019-04-02] => 0
       [2019-04-03] => 3
       [2019-04-04] => 0
       [2019-04-05] => 0
       [2019-04-06] => 0
       [2019-04-07] => 0
       [2019-04-08] => 0
       [2019-04-09] => 0
       [2019-04-10] => 8
       [2019-04-11] => 0
       [2019-04-12] => 0
       [2019-04-13] => 0
       [2019-04-14] => 0
       [2019-04-15] => 1
            )
数组的第一个和最后一个
索引将用作范围。

到目前为止我所尝试的

我使用的是这种方法,但似乎不起作用。在下面的代码中,
testArr
是上面发布的数组

                $i=0;    
                foreach ($testArr as $key => $value) {

                if($i==count($testArr)-1){break;}

                $currentDay=new DateTime($key);
                $nextDay=new DateTime(array_keys($testArr)[$i]);


                $diff=date_diff($nextDay,$currentDay);
                $diffint=intval($diff->format("%a"));
                if($diffint!==1){
                    $currentDay->modify('+1 day');
                    $temp=array($currentDay->format('Y-m-d')=>0);
                    $testArr = $this->insertArrayAtPosition($testArr,$temp,$i);
                }

                $i++;
            }

如果这个问题在某个地方已经有答案,那么不要忘记将其标记为重复。

您可以使用来生成目标时段内的每个日期,并填充集合中每个日期的值

$values=['2019-04-01'=>10,'2019-04-02'=>20,'2019-04-04'=>30];
$dates=新日期期间(新日期时间('2019-04-01')、新日期间隔('P1D')、新日期时间('2019-04-04');
foreach($日期作为$日期){
$values[$date->format('Y-m-d')]=$values[$date->format('Y-m-d')])0;
}
导致:

$values=[
'2019-04-01' => 10,
'2019-04-02' => 20,
'2019-04-03' => 0,
'2019-04-04' => 30,
]; 

您可以使用
DatePeriod
获取数组的第一个键和最后一个键之间的范围

$arr = array(
    "2019-04-01" => 1,
    "2019-04-03" => 3,
    "2019-04-10" => 8,
    "2019-04-15" => 1,
);

$keys = array_keys( $arr );
$start = new DateTime($keys[0]);
$stop = new DateTime($keys[ count( $keys ) - 1 ]);
$stop->modify('+1 day');

$range = new DatePeriod($start, new DateInterval('P1D'), $stop);
$result = array();

foreach ($range as $key => $value) {
    $date = $value->format('Y-m-d');

    if ( isset( $arr[ $date ] ) ) $result[ $date ] = $arr[ $date ];
    else $result[ $date ] = 0;
}
这将导致:

Array
(
    [2019-04-01] => 1
    [2019-04-02] => 0
    [2019-04-03] => 3
    [2019-04-04] => 0
    [2019-04-05] => 0
    [2019-04-06] => 0
    [2019-04-07] => 0
    [2019-04-08] => 0
    [2019-04-09] => 0
    [2019-04-10] => 8
    [2019-04-11] => 0
    [2019-04-12] => 0
    [2019-04-13] => 0
    [2019-04-14] => 0
    [2019-04-15] => 1
)

可以使用
DatePeriod
请检查下面的代码

<?php
$testArr = array('2019-04-01'=>1,'2019-04-03'=>3,'2019-04-10'=>8,'2019-04-15'=>1);

$start = new DateTime('2019-04-01'); // your start key
$end = new DateTime('2019-04-16'); // your end key

$interval = DateInterval::createFromDateString('1 day');
$period = new DatePeriod($start, $interval, $end);

$finalArr = array();
foreach ($period as $dt) {
    if(array_key_exists($dt->format("Y-m-d"), $testArr)){
        $finalArr[$dt->format("Y-m-d")] = $testArr[$dt->format("Y-m-d")];
    }else{
        $finalArr[$dt->format("Y-m-d")] =  0;   
    }

}
echo '<pre>';
print_r($finalArr);
exit();
?>


工作正常。这是在添加日期,但却弄乱了日期的顺序。开始的4个索引最初在数组中,但填充的元素在最后被推送。有没有办法把它们放在正确的位置?@MuhammadOsama
YYYY-MM-DD
日期很容易排序,你可以使用
ksort($values)
。谢谢山姆:)我很感谢你的时间工作(完美的艾迪!)谢谢你帮我。就我个人所知,我只想问一个小问题,修改+1天的原因是什么?:)您在该范围内又增加了1天,但仍然可以完美工作。最后一个索引是否排除在范围之外?如果没有
+1
,它将在
2019-04-14
结束。它介于开始和结束之间,因此要包括15,我们需要添加+1