2017-06-01 12 views
1

以下のロジックで次の配列をソートする必要があります: 'score'が同じ場合、 'time'を使用して比較します。上記アレイ内usortと宇宙船オペレータを使用して多次元配列を正しく並べ替える

$user_scores = [ 82 => [ 'score' => 1, 'time' => 6.442 ], 
       34 => [ 'score' => 1, 'time' => 5.646 ], 
       66 => [ 'score' => 3, 'time' => 1.554 ] 
       ] 

「キーは」私はソートされた配列に保存する必要が「user_ids」、次のとおり次のように配列されます。私の最高の試みは、これまでのところ、以下のようである - 明らかに

$result = usort($user_scores, function ($a, $b) { 
    if ($a['score'] == $b['score']) { 
     return $a['time'] == $b['time']; 
     } 
    return $a['score'] <=> $b['score']; 
}); 

、これは動作していない、と私はすべてのキーとの$ user_scores配列ではなくuser_ids(82の0、1、2、34に置き換え取得しています66)。ソートも機能していません。上記アレイの場合

、私の所望の出力は$ user_scores配列のようになります。あなたはどのように(それが理にかなっている場合)宇宙船演算子を使用して、この仕事をするために私に言うことができれば

$user_scores = [ 34 => [ 'score' => 1, 'time' => 5.646 ], 
       82 => [ 'score' => 1, 'time' => 6.442 ], 
       66 => [ 'score' => 3, 'time' => 1.554 ] 
       ] 

は本当に感謝します。あなたの時間をありがとう、私はあなたの応答を楽しみにしています。

--- --- UPDATE

必要なソートロジックはこのようなものです:

  1. より高いスコアは、より高いランクになります。
  2. 時刻が高いほど、ランクが低くなります。

これは基本的にクイズの結果をソートしています。時間の最も短いトップスコアラーがトップになります。スコアが低く、時間が長いものは最下位に位置します。

答えて

1

キーを保持するには、uasort()を使用する必要があります。
私はあなたの返信timeの比較に宇宙船を追加しました。
score比較の返品の順序を変更しました。
$resultは、あなたには役に立たないようにtrue/falseを返すだけです。 sort()の関数は変数に代入されません。入力配列に直接影響します。

方法:

$user_scores = [ 82 => [ 'score' => 1, 'time' => 6.442 ], 
       34 => [ 'score' => 1, 'time' => 5.646 ], 
       66 => [ 'score' => 3, 'time' => 1.554 ], 
       7 => [ 'score' => 2, 'time' => 4.442 ], 
       99 => [ 'score' => 4, 'time' => 3.646 ], 
       55 => [ 'score' => 1, 'time' => 2.554 ] 
       ]; 

uasort($user_scores,function($a,$b){ 
    if($a['score'] == $b['score']){ 
     return $a['time'] <=> $b['time']; 
    } 
    return $b['score'] <=> $a['score']; 
}); 
var_export($user_scores); 

出力:キーが出力に変化している

array (
    99 => 
    array (
    'score' => 4, 
    'time' => 3.646, 
), 
    66 => 
    array (
    'score' => 3, 
    'time' => 1.554, 
), 
    7 => 
    array (
    'score' => 2, 
    'time' => 4.442, 
), 
    55 => 
    array (
    'score' => 1, 
    'time' => 2.554, 
), 
    34 => 
    array (
    'score' => 1, 
    'time' => 5.646, 
), 
    82 => 
    array (
    'score' => 1, 
    'time' => 6.442, 
), 
) 
+0

時間が時間を意味= 5.64599999999999990762944435118697583675384521484375 –

+0

から5.646は必ずそれをここでチェックしhttps://eval.in/809606 –

+0

が、 print_r()を使用してhttps://eval.in/809610を使用してもOKです –

関連する問題