此数组优雅的方式是我的数组:排序这样
$arr = array(-3, -4, 1, -1, 2, 4, -2, 3);
我想这样的排序是:
1
2
3
4
-1
-2
-3
-4
因此,首先将有来自分类greated大于零值最低值到最高值,则会有负值从最高值到最低值排序。
有没有一些优雅的方式来做到这一点?
此数组优雅的方式是我的数组:排序这样
$arr = array(-3, -4, 1, -1, 2, 4, -2, 3);
我想这样的排序是:
1
2
3
4
-1
-2
-3
-4
因此,首先将有来自分类greated大于零值最低值到最高值,则会有负值从最高值到最低值排序。
有没有一些优雅的方式来做到这一点?
这里有一个非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);
?>
这里有一个简单的比较功能:
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篱笆的阴性侧。如果您希望它们上升到所述栅栏的正面的顶部,请将>
更改为>=
。我进入
最好的算法是:
if ((a >= 0) == (b >= 0)) {
return a - b;
} else {
return b - a;
}
将从阵列(如接头)的级分类负数
我们应该假定为零永远不会出现在这个数组中? – BoltClock 2010-08-12 11:15:48
@BoltClock是的。 – 2010-08-12 11:16:48