如何使用PHP在foreach中从高值到小值进行排序


How to sort from higher to smaller value in foreach by using PHP?

我在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在这种情况下不是合适的工具。您应该使用whileDate::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);