PHP DateInterval не применяется к объекту DateTime

Я хотел бы, чтобы массив начинался с первого дня месяца и заканчивался последним.

$days = array();
$sdays = cal_days_in_month(CAL_GREGORIAN, date('m'), date('Y'));
$d = new DateTime();
$d->modify('first day of this month');
for($i; $i<$sdays; $i++)
{
    $days[(int)$d->format('W')][(int)$d->format('N')] = $d->format('Y-m-d');
    $d->add(new DateInterval('P1D'));
}
print_r($days);
exit();

Так что это довольно просто. Но результат выглядит так, как будто функция DateInterval не работает должным образом.

Ожидание:

Array
(
    [14] => Array // week
        (
            [1] => 2013-04-01
            [2] => 2013-04-02
            [3] => 2013-04-03
...

Реальность:

Array
(
    [14] => Array
        (
            [1] => 2013-04-01
        )
)

Да, метод, как вы можете исправить это, также прост, создайте другой объект DateTime, измените его на первый день, затем создайте новый объект DateTime с первого дня, затем вы можете добавить к нему DateInterval.

Поэтому после того, как я изменил свой объект DateTime с помощью $d->modify, к нему не может быть добавлена ​​​​дата. Но вопрос почему? Я хотел бы понять это.

Спасибо за ответ.

Répás


person Répás    schedule 30.04.2013    source источник
comment
Что касается PHP 5.4.5, ваш скрипт работает... $i = 0 - единственное, что я исправил. А с $d->add(new DateInterval('P1D')) ничего нет. FIDDLE   -  person BlitZ    schedule 30.04.2013


Ответы (1)


Вы всегда используете один и тот же объект, он ссылается на одни и те же данные. Вам нужно клонировать его

<?php
$days = array();
$sdays = cal_days_in_month(CAL_GREGORIAN, date('m'), date('Y'));
$d = new DateTime();
$d->modify('first day of this month');

for($i = 0; $i<$sdays; $i++)
{
    $v = clone $d;
    $v->modify("+$i day");
    $days[(int)$v->format('W')][(int)$v->format('N')] = $v->format('Y-m-d');

}
print_r($days);
person Dezigo    schedule 30.04.2013