【发布时间】:2010-08-12 11:11:11
【问题描述】:
这是我的数组:
$arr = array(-3, -4, 1, -1, 2, 4, -2, 3);
我想这样排序:
1
2
3
4
-1
-2
-3
-4
所以首先会有大于零的值从最小值到最大值排序,然后会有负值从最大值到最小值排序。
有什么优雅的方法可以做到这一点吗?
【问题讨论】:
-
我们是否应该假设零永远不会出现在这个数组中?
这是我的数组:
$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;
}
这将从数组末尾开始对负数进行排序(如拼接)
【讨论】: