2016-05-06 4 views
1

私がやっていることは、数値で多次元配列をソートすることですが、0に等しい値を配列の最後に並べることです。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を返し、

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; 
} 
  • まず:私はこのようにそれを行うだろう。

  • 第2および第3、それらのいずれかが(彼らは両方ともゼロ た場合、それはすでに戻ってきたであろうから)ゼロは、その一方が他方の後 を並べ替える必要があります場合。

  • 第4に、いずれもゼロではないため、通常の値と比較してください。

+0

[OK]をクリックします。答えをありがとう。同じように動作する別の答えがあるように見えます。 – 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またはnullまたは空の配列の場合はどうなりますか?問題は「0」に関するものでした。 – Axalix

+0

これは正解でもあり、私の場合は数字で動作しますが、誤った値に注意してください。この並べ替えの仕組みの説明については、受け入れられた回答を参照してください。 – stwhite

+0

@Axalix:配列には数字だけが含まれていますが、あなたの質問は無関係です。 –

関連する問題