2016-05-06 82 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:數組只包含數字,你的問題是無關緊要的。 –