php обратный порядок периода времени в foreach

привет у меня есть скрипт дает мне список дней дата между неделю. мне нужен обратный порядок. alredy попробовал rsort, reverse_array и многое другое, как все дающие ошибку.

спасибо.

скрипт

$date2 = "$lastweek2";
$date1 = "$lastweek1";

$start    = new DateTime($date2);
$end      = new DateTime($date1);
$interval = DateInterval::createFromDateString('1 day');
$period   = new DatePeriod($start, $interval, $end);

echo "<br>";
foreach ($period as $dt) {
    echo $dt->format("Y-m-d") . "<br>n";
}

Эхо выглядит так

2014-08-09
2014-08-10
2014-08-11
2014-08-12
2014-08-13
2014-08-14
2014-08-15

отменено

2014-08-15
2014-08-14
2014-08-13
2014-08-12
2014-08-11
2014-08-10
2014-08-09

4 ответов


просто поместите даты в массив, а затем измените порядок массива с помощью array_reverse()

$dates = array();
foreach ($period as $dt) {
    $dates[] = $dt->format("Y-m-d");
}

$dates = array_reverse($dates);
echo implode("<br>\n", $dates);

$period = array_reverse(iterator_to_array ($period));


С помощью отрицательный один день интервал и разница дней между двумя датами вы можете сделать то же самое без необходимости использовать array_reverse(iterator_to_array()) или построить другой массив.

пример:https://3v4l.org/B3nNk

$start = new \DateTime('2014-08-15');
$end = new \DateTime('2014-08-09');
$diff = $end->diff($start);
$interval = \DateInterval::createFromDateString('-1 day');

$period = new \DatePeriod($start, $interval, $diff->days);
foreach ($period as $date) {
    echo $date->format('Y-m-d') . PHP_EOL;
}

результат:

2014-08-15
2014-08-14
2014-08-13
2014-08-12
2014-08-11
2014-08-10
2014-08-09

таким образом, он говорит DatePeriod вычесть 1 день, за количество дней, возвращенных из diff, вместо сложения до даты окончания.


$date1 = "2014-08-15";
$date2 = "2014-08-09";

$start    = new DateTime($date2);
$end      = new DateTime($date1);
$i = DateInterval::createFromDateString('1 day');
while ($end >= $start) {
  echo $end->format("Y-m-d") . "<br>\n";
  $end = $end->sub($i);
}