2016-05-06 49 views
1

我想要做的是按数字对多维数组排序,但将任何值等于0排列在数组的末尾。按数字值对零排序多维数组最后

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

的输出要求是: 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

你比较函数是有点过。我会做这样的:

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,不管 他们无论是否是零。

  • 第二和第三,如果其中一方零,即应该进行排序后,其他 (因为它已如果他们 都为零将返回)。

  • 第四,既不是零,所以只是比较正常值。

+0

确定这是有道理的现在。感谢你的回答。看起来还有另一个可行的答案。 – stwhite

+0

另一个更简单。不用担心,如果你宁愿接受它。 –

+0

对于那些试图找出同样东西的人来说,我认为你的回答给出了我认为更重要的解释。 – stwhite

1

这样:

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

如果'$ a ['position']'为false或为空或者为空阵列呢?问题是关于'0'。 – Axalix

+0

这也是一个正确的答案,它适用于我的情况与数字,但是,请注意错误值。请参阅接受的答案以解释如何排序工作。 – stwhite

+0

@Axalix:数组只包含数字,你的问题是无关紧要的。 –