我正在使用usort()
对关联数组日期属性(unix时间戳)进行排序。这是有意的。但我想稍微扩展一下功能(如果可能的话)。所有日期都是> “now”应该是相反的顺序。换句话说,我希望最接近“now”的日期位于列表的顶部。如果我需要详细说明,请告诉我。我目前的代码:
usort($DTO, function($a, $b) {
return $b['date'] - $a['date'];
});
答案 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)位于顶部。当你进一步向下列表时,现在和之后的绝对差异会增加,混合过去和未来的日期。
如果这些解释都不是您的意思,您需要澄清您的问题。