2010-08-12 25 views
4

此数组优雅的方式是我的数组:排序这样

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

我想这样的排序是:

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

因此,首先将有来自分类greated大于零值最低值到最高值,则会有负值从最高值到最低值排序。

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

+1

我们应该假定为零永远不会出现在这个数组中? – BoltClock 2010-08-12 11:15:48

+0

@BoltClock是的。 – 2010-08-12 11:16:48

回答

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;')); 
+0

我会将最后一位更改为: $ sorted = array_merge($ positive,$ negative); – Sebs 2010-08-12 11:21:50

+0

@ Prot0:我刚刚做到了。 – BoltClock 2010-08-12 11:22:18

+0

我有PHP <5.3(PHP 5.2.8或类似的东西),所以我尝试了这一点,它不起作用。解决方案是使用create_function():)这在较早的PHP 5版本中起作用。 – 2010-08-12 11:41:07

2

usort()可以,如果它符合你的审美感受

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.

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

另外:通过以上,零点落在ne篱笆的阴性侧。如果您希望它们上升到所述栅栏的正面的顶部,请将>更改为>=我进入

0

最好的算法是:

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

将从阵列(如接头)的级分类负数