繁体   English   中英

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

[英]Elegant way to sort an array like this

这是我的阵列:

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

我想这样排序:

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

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

有一些优雅的方式来做到这一点?

这是一个简单的比较功能:

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

旁白:有了上述,零落在围栏的负面。 更改>>=如果你想让他们上升到所述护板的正面一侧的顶部。

这是一个非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;'));

usort()可以使用您自己的一组规则对任何内容进行排序
不知道它是否适合你的美学感受

我确信这可以缩短,但这有效:

<?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);

?>

工作环节。

我遇到的最佳算法是:

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

这将从数组末尾排序负数(如拼接)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM