我想创建一个由升序日期对象组成的数组。我尝试了以下代码:
$dat=date_create_from_format("Y-m-d H:i:s", "2014-11-01 00:00:00");
for ($i=0; $i<=2; $i++) {
$ar[$i]=$dat;
$dat->modify('+1 day');
}
print_r($ar);
结果是同一天的三倍:
Array
(
[0] => DateTime Object
(
[date] => 2014-11-04 00:00:00.000000
[timezone_type] => 3
[timezone] => Europe/Berlin
)
[1] => DateTime Object
(
[date] => 2014-11-04 00:00:00.000000
[timezone_type] => 3
[timezone] => Europe/Berlin
)
[2] => DateTime Object
(
[date] => 2014-11-04 00:00:00.000000
[timezone_type] => 3
[timezone] => Europe/Berlin
)
)
但我想得到的是:
Array
(
[0] => DateTime Object
(
[date] => 2014-11-01 00:00:00.000000
[timezone_type] => 3
[timezone] => Europe/Berlin
)
[1] => DateTime Object
(
[date] => 2014-11-02 00:00:00.000000
[timezone_type] => 3
[timezone] => Europe/Berlin
)
[2] => DateTime Object
(
[date] => 2014-11-03 00:00:00.000000
[timezone_type] => 3
[timezone] => Europe/Berlin
)
)
有人有想法吗?可能是新手的东西; - )
答案 0 :(得分:1)
由于$dat
是一个obejct,$ar
中的所有项都存储对此对象的引用。因此,当此对象更改($dat->modify()
)时,所有引用都会立即看到此更改。要创建不同的对象,可以clone
源对象:
$dat = date_create_from_format("Y-m-d H:i:s", "2014-11-01 00:00:00");
for ($i = 0; $i <= 2; $i++) {
$ar[$i] = clone $dat;
$dat->modify('+1 day');
}
print_r($ar);
此处clone
运算符会获取当前$dat
对象并复制它。因此,当您再次更改$dat
时,副本不会知道它。