0

我正在使用usort(). 它按预期工作。但我想稍微扩展一下功能(如果可能的话)。所有>“现在”的日期应该是相反的顺序。换句话说,我希望最接近“现在”的日期位于列表顶部。如果我需要详细说明,请告诉我。我当前的代码:

usort($DTO, function($a, $b) {
     return $b['date'] - $a['date'];
});
4

1 回答 1

4

谢天谢地,您使用的是 PHP 5.3 或更高版本,如果没有一流的匿名函数,这样做会很痛苦。

你的排序应该是这样的。我已经用一些示例数据替换了你的变量来演示它是如何工作的。

我可以用两种方式解释您的请求。我将为两者提供示例。

$fake_dates = array( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 );
$current_date = 5;
$picky_date_sort = function($a, $b) use($current_date) { 
    if($a > $current_date && $b <= $current_date)
        return -1;
    if($b > $current_date && $a <= $current_date)
        return 1;
    if($a > $current_date || $b > $current_date)
        return $a - $b;
    return $b - $a; 
};
usort($fake_dates, $picky_date_sort);
print_r($fake_dates);

测试结果为:

Array
(
    [0] => 6
    [1] => 7
    [2] => 8
    [3] => 9
    [4] => 5
    [5] => 4
    [6] => 3
    [7] => 2
    [8] => 1
    [9] => 0
)

大于“现在”的日期位于顶部。它们按升序排序,这意味着当您在列表中向下排序时,您将进入更远的未来。当列表的该部分完成并且您再次点击过去时,降序排序返回,较新的日期高于较低的日期。

但是,也可以将您的请求解释为“我不在乎将过去与未来分开,我只想最接近现在的顶部”。这更容易。我们将打破abs数字之间的绝对差异。

$absolute_diff_sort = function($a, $b) use($current_date) {
    $abs_b = abs($b - $current_date);
    $abs_a = abs($a - $current_date);
    return $abs_a - $abs_b;
};
usort($fake_dates, $absolute_diff_sort); print_r($fake_dates);

结果是

Array
(
    [0] => 5
    [1] => 6
    [2] => 4
    [3] => 7
    [4] => 3
    [5] => 8
    [6] => 2
    [7] => 1
    [8] => 9
    [9] => 0
)

现在 (5) 在顶部。随着您在列表中走得更远,现在和之后的绝对差异会增加,混合过去和未来的日期。

如果这些解释都不是你的意思,你需要澄清你的问题。

于 2012-12-09T18:05:01.470 回答