php:使用升序日期对象创建一个数组

时间:2017-03-22 14:49:42

标签: php arrays datetime

我想创建一个由升序日期对象组成的数组。我尝试了以下代码:

$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
            )

    )

有人有想法吗?可能是新手的东西; - )

1 个答案:

答案 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时,副本不会知道它。