仅对PHP数组中的非零值进行排序

时间:2015-01-23 10:28:00

标签: php arrays

我想只排序数组中非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
}

4 个答案:

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