我在PHP中使用Foreach生成了上个月的日期范围,效果很好,但我想将其从最高值排序为小于。
<?php
$begin = new DateTime('2015-11-01');
$end = new DateTime(date("Y-m-d"));
$end = $end->modify('+1 day');
$interval = new DateInterval('P1D');
$daterange = new DatePeriod($begin, $interval, $end);
$i = 1;
foreach ($daterange as $in => $val) {
$tr = '<tr>' .
'<td>' . $i++ . '</td>' .
'<td>' . $val->format("Y-m-d") . ' 13:00' . '</td>' .
'</tr>';
echo $tr;
$tr = '<tr>' .
'<td>' . $i++ . '</td>' .
'<td>' . $val->format("Y-m-d") . ' 18:00' . '</td>' .
'</tr>';
echo $tr;
}
?>
以下是我的结果
1 2015-11-01 13:00
2 2015-11-01 18:00
3 2015-11-02 13:00
4 2015-11-02 18:00
5 2015-11-03 13:00
但是我想要这样的
1 2015-11-03 13:00
2 2015-11-03 18:00
3 2015-11-02 13:00
4 2015-11-02 18:00
5 2015-11-01 13:00
6 2015-11-01 18:00
感谢您的帮助
foreach
在这种情况下不是合适的工具。您应该使用while
和Date::sub(interval)
:
$i = 1;
echo "<table>";
$current = clone $end;
while( ($val = $current) >= $begin) {
$tr = '<tr>' .
'<td>' . $i++ . '</td>' .
'<td>' . $val->format("Y-m-d") . ' 13:00' . '</td>' .
'</tr>';
echo $tr;
$tr = '<tr>' .
'<td>' . $i++ . '</td>' .
'<td>' . $val->format("Y-m-d") . ' 18:00' . '</td>' .
'</tr>';
echo $tr;
$current->sub($interval);
}
您可以使用所谓的气泡排序:看看下面的代码,它从最大到最小进行排序
function bubble_sort($arr) {
$size = count($arr);
for ($i=0; $i<$size; $i++) {
for ($j=0; $j<$size-1-$i; $j++) {
if ($arr[$j+1] > $arr[$j]) {
swap($arr, $j, $j+1);
}
}
}
return $arr;
}
function swap(&$arr, $a, $b) {
$tmp = $arr[$a];
$arr[$a] = $arr[$b];
$arr[$b] = $tmp;
}
/* test bubble sort */
$arr = array(31,3,2,55,15,7,4,90);
print("Before sorting");
print_r($arr);
$arr = bubble_sort($arr);
echo "<br/>";
print("After sorting by using bubble sort");
echo "<br/>";
print_r($arr);
我猜new DatePeriod()
返回的结果已经排序。如果我没看错你的问题的话,看来你想倒过来。使用PHP的array_reverse
,可以反转数组。在foreach
-循环前面放置以下行应该会得到您想要的结果:
$daterange = array_reverse($daterange);