我正在使用usort()
. 它按预期工作。但我想稍微扩展一下功能(如果可能的话)。所有>“现在”的日期应该是相反的顺序。换句话说,我希望最接近“现在”的日期位于列表顶部。如果我需要详细说明,请告诉我。我当前的代码:
usort($DTO, function($a, $b) {
return $b['date'] - $a['date'];
});
我正在使用usort()
. 它按预期工作。但我想稍微扩展一下功能(如果可能的话)。所有>“现在”的日期应该是相反的顺序。换句话说,我希望最接近“现在”的日期位于列表顶部。如果我需要详细说明,请告诉我。我当前的代码:
usort($DTO, function($a, $b) {
return $b['date'] - $a['date'];
});
谢天谢地,您使用的是 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) 在顶部。随着您在列表中走得更远,现在和之后的绝对差异会增加,混合过去和未来的日期。
如果这些解释都不是你的意思,你需要澄清你的问题。