这是我的阵列:
$arr = array(-3, -4, 1, -1, 2, 4, -2, 3);
我想这样排序:
1
2
3
4
-1
-2
-3
-4
因此,首先会有从最低值到最高值排序的值大于零的值,然后会有从最高值到最低值排序的负值。
有一些优雅的方法吗?
答案 0 :(得分:10)
这是一个简单的比较函数:
function sorter($a, $b) {
if ($a > 0 && $b > 0) {
return $a - $b;
} else {
return $b - $a;
}
}
$arr = array(-3, -4, 1, -1, 2, 4, -2, 3);
usort($arr, 'sorter');
var_dump($arr);
除此之外:如上所述,零落在围栏的负面。如果您希望>
升到所述围栏正面的顶部,请将>=
更改为{{1}}。
答案 1 :(得分:6)
这是一个非usort()
方法,假设零是无关的......
<?php
$arr = array(-3, -4, 1, -1, 2, 4, -2, 3);
$positive = array_filter($arr, function($x) { return $x > 0; });
$negative = array_filter($arr, function($x) { return $x < 0; });
sort($positive);
rsort($negative);
$sorted = array_merge($positive, $negative);
print_r($sorted);
?>
编辑:没有PHP 5.3?正如您所说的那样使用create_function()
:
$positive = array_filter($arr, create_function('$x', 'return $x > 0;'));
$negative = array_filter($arr, create_function('$x', 'return $x < 0;'));
答案 2 :(得分:2)
usort()可以使用您自己的一套规则对任何内容进行排序 不知道它是否符合你的美学感受
答案 3 :(得分:2)
我确信这可以缩短,但这样做有效:
<?php
function cmp($a, $b)
{
if ($a == $b)
return 0;
if($a>=0 && $b>=0 )
return ($a < $b) ? -1 : 1;
if( $a<=0 && $b<=0)
return (-$a < -$b) ? -1 : 1;
if($a>0)
return -1;
return 1;
}
$a = array(-3, -4, 1, -1, 2, 4, -2, 3);
var_dump($a);
usort($a, "cmp");
var_dump($a);
?>
答案 4 :(得分:0)
我遇到的最佳算法是:
if ((a >= 0) == (b >= 0)) {
return a - b;
} else {
return b - a;
}
这将从数组的末尾(如拼接)
排序负数