[英]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.