构建碳对象数组 - PHP
Building an array of Carbon Objects - PHP
我在尝试添加和创建一个包含 carbon 的日期实例数组时感到困惑。我想要实现的是一个数组,在 2 个日期之间的每一天都有一个碳对象。
这是我目前的情况:
// 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 覆盖。任何人有任何想法为什么?
我是 运行 php mamp 7.0.0 和 Larvel 5.2。
在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);
}
这是实现与 2022 年 2 月相同功能的更合适的方法(使用 Carbon v2.57):
$dates = CarbonPeriod::create($startDate, $endDate)->toArray();
干杯!
我在尝试添加和创建一个包含 carbon 的日期实例数组时感到困惑。我想要实现的是一个数组,在 2 个日期之间的每一天都有一个碳对象。
这是我目前的情况:
// 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 覆盖。任何人有任何想法为什么?
我是 运行 php mamp 7.0.0 和 Larvel 5.2。
在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);
}
这是实现与 2022 年 2 月相同功能的更合适的方法(使用 Carbon v2.57):
$dates = CarbonPeriod::create($startDate, $endDate)->toArray();
干杯!