我想只排序数组中非0的值,所有0值key应位于底部。例如,如果我们的数组是这样的 -
array
{
[0]=>4
[1]=>0
[2]=>2
[3]=>0
[4]=>3
}
如此排序的数组我应该如下所示
array
{
[2]=>2
[4]=>3
[0]=>4
[1]=>0
[3]=>0
}
答案 0 :(得分:4)
使用uasort()
功能:
$arr = array(
4, 0, 2, 0, 3
);
uasort($arr, function($a, $b){
if ($a == 0) {
return 1;
}
if ($b == 0) {
return -1;
}
return ($a < $b) ? -1 : 1;
});
print_r($arr);
答案 1 :(得分:1)
使用自定义排序功能,您可以使用:
function usortTest($a, $b) {
if( $a == 0 ) return 1;
if( $b == 0 ) return -1;
return gmp_cmp($a, $b);
}
$test = array(4,0,2,0,3);
usort($test, "usortTest");
print_r($test);
可能需要重构/改进,但the documentation应该可以帮助您了解自定义排序功能。
答案 2 :(得分:1)
有一个PHP函数调用uasort,它允许您定义一个函数来对数组进行排序并维护数组键顺序。
定义函数的返回值必须为0,-1或1,具体取决于值是否相同,第二个值是否小于第一个值,或者第二个值是否大于第一个值,分别
要实现您的尝试,需要类似于以下功能:
$array = array(4,0,2,0,3);
uasort($array, function($a,$b) {
// push all 0's to the bottom of the array
if( $a == 0 ) return 1;
if( $b == 0 ) return -1;
if($a == $b) {return 0; } // values are the same
return ($a < $b) ? -1 : 1; // smaller numbers at top of list
});
var_dump($array);
/*
array (size=5)
2 => int 2
4 => int 3
0 => int 4
3 => int 0
1 => int 0
*/
答案 3 :(得分:0)
或者跟@axiac说的那样:
$a = array(4, 0, 2, 0, 3);
function getZeros(&$a) {
$zeros = array();
for($i = 0; $i < count($a); $i++) {
if($a[$i] === 0) {
$zeros[] = 0;
unset($a[$i]);
}
}
return $zeros;
}
$zeros = getZeros($a);
sort($a);
$a = array_merge($a, $zeros);
echo join(', ', $a);