按数字值排序多维数组,最后为零

时间:2016-05-06 23:44:36

标签: php arrays sorting multidimensional-array

我尝试做的是按数字对多维数组进行排序,但任何值等于0,都在数组的末尾。

此代码适用于使用0和1位数进行排序,但在添加不同数字时似乎会中断。

输出需要是: 41,42,43,44,45,46,0,0,0

<?php

$array = array(
    array(
        "position" => 41,
    ),
    array(
        "position" => 43,
    ),
    array(
        "position" => 42,
    ),
    array(
        "position" => 44,
    ),
    array(
        "position" => 45,
    ),
    array(
        "position" => 0,
    ),
    array(
        "position" => 0,
    ),
    array(
        "position" => 0,
    ),
    array(
        "position" => 46,
    ),
);
// Sort ascending 
usort($array, 'sortByPosition');

// Show result
echo '<pre>';
print_r($array);

function sortByPosition($a, $b) {
    return $a['position'] != 0 ? $a['position'] - $b['position'] : $b['position'] - $a['position'];
}

2 个答案:

答案 0 :(得分:2)

你的比较功能有点偏。我会这样做:

function sortByPosition($a, $b) {
    if ($a['position'] == $b['position']) return 0;
    if ($a['position'] == 0) return 1;
    if ($b['position'] == 0) return -1;
    return $a['position'] > $b['position'] ? 1 : -1;
}
  • 首先,如果两个位置相同,则返回0,无论如何 是否为零。

  • 第二个和第三个,如果其中任何一个 为零,那么应该排序 在另一个之后(因为如果他们已经回来已经回来了 零)。

  • 第四,两者都不为零,所以只需正常比较这些值。

答案 1 :(得分:1)

这样:

usort($array, function ($a, $b) { 
    if (!$a['position']) return 1;
    if (!$b['position']) return -1;
    return $a['position']-$b['position'];
});