2017-04-21 6 views
0

私は本当に頑張っていますが、私の二次元配列をPHPで必要な方法でソートすることに失敗しました。数値型のアルファベット順のPHPの二次元配列

私は名前や人物の年齢を格納し、のように見えるのアレイ持って:私は、次の操作を行って、年齢によって、この配列をソートするために管理

$array[0][0]="Alex" 
$array[0][1]=38 
$array[1][0]="Peggy" 
$array[1][1]=37 
$array[2][0]="Ben" 
$array[2][1]=38 

をというように.... :

usort($DATA, function($a, $b) { 
    return $b[1] - $a[1]; 
}); 

しかし、同じ年齢の人物をアルファベット順にソートして別のレイヤーを追加したいと思います。だから、最初に、配列が年齢でソートされているいくつかの年齢層が同一である場合、その後、アルファベット順のソートは、第一およびベン右のそれの後にアレックスを持っているために行われます...

答えて

1

usort() documentationによると、「比較関数は整数を返す必要があります第1引数がそれぞれ第2引数よりも小さい、等しい、またはより大きいとみなされる場合、ゼロより小さい、等しい、またはより大きい値を返します。だからではなく、ただ、すぐに返すの差がゼロであれば、チェックし、それに従って行動する:;> 0 str1がstr2のより大きい場合

<?php 
$array = [["Alex",38], ["Peggy",37], ["Ben",38]]; 
usort($array, function($a, $b) { 
    $diff = $b[1] - $a[1]; 
    if ($diff === 0) { 
     $diff = strcmp($a[0], $b[0]); 
    } 
    return $diff; 
}); 
print_r($array); 

をここでは、str1がstr2の未満の場合< 0を返す」strcmp() functionを使用します、「もし必要ならば、等しい」なら0を返します。

出力:

Array 
(
    [0] => Array 
     (
      [0] => Alex 
      [1] => 38 
     ) 

    [1] => Array 
     (
      [0] => Ben 
      [1] => 38 
     ) 

    [2] => Array 
     (
      [0] => Peggy 
      [1] => 37 
     ) 

) 
+0

ありがとうございました。できます。 私の '年齢'が浮動小数点型varであり、ソート結果が正しくないため大きな問題がありました。私はそれらを整数で変換しましたが、今は問題ありません。あなたのサンプルが実際に動作していた理由と、なぜコード内に挿入されたのかは分かりませんでした。 – MaitreWado

1

あなたは、列(array_columnでそれらを抽出する)ことにより、array_multisortと並べ替えを使用することができます。ここでは

array_multisort(array_column($array, 1), array_column($array, 0), $array); 

working demoです。

+0

興味深いアプローチでは、前に 'array_column'を使ったことはありませんでした。 – miken32

関連する問題