优雅的方式来排序这样的数组

时间:2010-08-12 11:11:12

标签: php arrays sorting

这是我的阵列:

$arr = array(-3, -4, 1, -1, 2, 4, -2, 3);

我想这样排序:

1
2
3
4
-1
-2
-3
-4

因此,首先会有从最低值到最高值排序的值大于零的值,然后会有从最高值到最低值排序的负值。

有一些优雅的方法吗?

5 个答案:

答案 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);

?>

Working link.

答案 4 :(得分:0)

我遇到的最佳算法是:

    if ((a >= 0) == (b >= 0)) {
        return a - b;
    } else {
        return b - a;
    }

这将从数组的末尾(如拼接)

排序负数