我有一个这样的数组:
[
['array-5', 0],
['array-4', 0],
['array-1',-1],
['array-3', 2],
['array-2', 3]
]
我想在 PHP 中对此进行排序,以便负数排在正数之前,如果符号相同,则大小(更负或更正)优先。
对于上面的例子,期望的输出是:
[
['array-1',-1],
['array-2', 3],
['array-3', 2],
['array-4', 0],
['array-5', 0]
]
如果
$data
有你的输入,你可以这样调用usort
:
usort($data, function ($a, $b) {
$res = ($b[1] < 0) - ($a[1] < 0);
$diff = abs($b[1]) - abs($a[1]);
return $res ? $res : ($diff > 0) - ($diff < 0);
});
执行后,
$data
将有所需的订单。
先按负数排序,再按绝对值降序排序。
代码:(演示)
usort(
$array,
fn($a, $b) => [$b[1] < 0, abs($b[1])]
<=>
[$a[1] < 0, abs($a[1])]
);
或者将
abs()
调用分开作为第二个/后备评估:(Demo)
usort(
$array,
fn($a, $b) => ($b[1] < 0 <=> $a[1] < 0)
?: (abs($b[1]) <=> abs($a[1]))
);
也许更有效但不那么简洁的方法是通过仅对每个值调用一次
abs()
来隔离绝对值。
代码:(演示)
$notNegs = [];
$absVals = [];
foreach ($array as [1 => $v]) {
$abs = abs($v);
$absVals[] = $abs;
$notNegs[] = $v === $abs;
}
array_multisort($notNegs, $absVals, SORT_DESC, $array);