usort() - 如果日期是>今天

时间:2012-12-09 17:33:21

标签: php

我正在使用usort()对关联数组日期属性(unix时间戳)进行排序。这是有意的。但我想稍微扩展一下功能(如果可能的话)。所有日期都是> “now”应该是相反的顺序。换句话说,我希望最接近“now”的日期位于列表的顶部。如果我需要详细说明,请告诉我。我目前的代码:

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

1 个答案:

答案 0 :(得分:3)

谢天谢地,你正在使用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)位于顶部。当你进一步向下列表时,现在和之后的绝对差异会增加,混合过去和未来的日期。

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