构建一个Carbon对象数组 - PHP

时间:2016-01-17 23:09:31

标签: php php-carbon

我很困惑尝试使用碳添加创建日期实例数组。我想要实现的是在两个日期之间每天都有一个碳对象的数组。

这是我到目前为止所拥有的:

// Get oldest and newest date by sorting the array by created_at
usort($data, function($a, $b) {
    return $a->created_at <=> $b->created_at;
});

$a = end($data);
$to  = $a->created_at; //-> Newest date
$from = $data[0]->created_at; //-> Oldest date

// Work out the difference between to and from dates
$carbonTO = new Carbon($to);
$carbonFrom = new Carbon($from);
$diff = $carbonFrom->diffInDays($carbonTO);

// Write the dates to an array
$i = 0;
while ($diff >= 0) {
    $filters[$i] = $carbonFrom->addDays($i);
    $diff--;
    $i++;
    var_dump($filters);
}

die();
return $filters;

所以循环回声中的var_dump是这样的:

array(1) { 
    [0]=> object(Carbon\Carbon)#238 (3) { 
        ["date"]=> string(26) "2016-01-17 19:04:49.000000" 
        ["timezone_type"]=> int(3) 
        ["timezone"]=> string(3) "UTC" 
        } 
 } 

array(2) { 
    [0]=> object(Carbon\Carbon)#238 (3) { 
        ["date"]=> string(26) "2016-01-18 19:04:49.000000" 
        ["timezone_type"]=> int(3) 
        ["timezone"]=> string(3) "UTC" 
        } 
     [1]=> object(Carbon\Carbon)#238 (3) { 
         ["date"]=> string(26) "2016-01-18 19:04:49.000000" 
         ["timezone_type"]=> int(3) 
         ["timezone"]=> string(3) "UTC" 
         } 
      }

正如您所看到的,第二次输出数组时,0的键已被2016-01-18的较新日期覆盖。有人有什么想法吗?

我正在使用Larvel 5.2在mamp上运行php 7.0.0。

1 个答案:

答案 0 :(得分:1)

在PHP except where otherwise noted中,对象是通过引用而不是按值分配的。这意味着每次将对象分配给变量时,只需存储对相同对象的引用。在var_dump()代码中显示的内容,所有对象都是相同的#238:

object(Carbon\Carbon)#238

一般解决方案是使用不可变对象(if available)或只是克隆现有对象:

while ($diff >= 0) {
    $filters[$i] = clone $carbonFrom->addDays($i);
    $diff--;
    $i++;
    var_dump($filters);
}