首先按一列具有负值的值对二维数组的行进行排序,然后按绝对值降序排序

问题描述 投票:0回答:2

我有一个这样的数组:

[
    ['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]
]
php arrays sorting multidimensional-array array-multisort
2个回答
1
投票

如果

$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
将有所需的订单。


0
投票

先按负数排序,再按绝对值降序排序。

代码:(演示

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);
© www.soinside.com 2019 - 2024. All rights reserved.