две даты в php, для каждого цикла между датами, но наоборот?

это связано с другим вопросом, заданным здесь, который отлично работает, но мне нужно наоборот, есть ли у вас идеи, как это реализовать?

исходный вопрос здесь through-all-of-these-d/26297242">У меня есть 2 даты в PHP, как я могу запустить цикл foreach, чтобы пройти через все эти дни?


php
person Display name    schedule 10.10.2014    source источник
comment
stackoverflow.com/a/10777617/1870760   -  person Hatted Rooster    schedule 10.10.2014
comment
это объект, а не массив, он не работает с обратным массивом   -  person Display name    schedule 10.10.2014


Ответы (3)


Вы можете использовать iterator_to_array + array_reverse методы:

foreach (array_reverse(iterator_to_array($period)) as $day) {...}
person Im0rtality    schedule 10.10.2014
comment
идеально именно то, что я искал. Спасибо. я сделал обратный массив, но пропустил iterator_array. - person Display name; 10.10.2014

Использование генераторов PHP 5.5

function period($begin, $interval, $end) {
    if ($begin < $end) {
        while ($begin <= $end) {
            yield $begin;
            $begin->add($interval);
        }
    }else {
        while ($end <= $begin) {
            yield $begin;
            $begin->sub($interval);
        }
    }
}

$interval = new \DateInterval('P1D');

$begin = new \DateTime( '2010-05-10' );
$end = new \DateTime( '2010-05-01' );

foreach (period($begin, $interval, $end) as $dt) {
    echo $dt->format( "l Y-m-d H:i:s" ), PHP_EOL;
}

$begin = new \DateTime( '2010-05-01' );
$end = new \DateTime( '2010-05-10' );

foreach (period($begin, $interval, $end) as $dt) {
    echo $dt->format( "l Y-m-d H:i:s" ), PHP_EOL;
}
person Mark Baker    schedule 10.10.2014

да, вы можете использовать его в обратном формате даты

$begin = new DateTime( '2010-05-01' );
$end   = new DateTime( '2010-05-10' );

$interval = DateInterval::createFromDateString('1 day');
$period = new DatePeriod($begin, $interval, $end);

$reverse = array_reverse(iterator_to_array($period));  //sorts in descending order...

foreach ( $reverse as $dt )
  echo $dt->format( "l Y-m-d H:i:s\n" ); //apply the format you want.

если я вас неправильно понял, пожалуйста, прокомментируйте...

person Ronser    schedule 10.10.2014
comment
Вы не можете сортировать объект DatePeriod, используя функции массива. - person cmbuckley; 10.10.2014
comment
извините, поменял на array_reverse - person Ronser; 10.10.2014