2016-08-04 5 views
0

ランキング機能を作成する必要があります。多次元配列の結び付き関数

私の$ passage配列には、 'user'、 'username'、 'note'、 'classement'の各キーがあります。

「メモ」キーでランク付けし、「ユーザー名」キーで配列を並べるには、「クラス分け」キーを設定します。ここで

は私が試したものです:

for ($i = 0; $i < sizeof($passages); $i++) { 
     for ($j = 0; $j < sizeof($passages); $j++) { 
      $test = $this->compare($passages[$i]['note'], $passages[$j]['note']); 
      if ($test < 0) { 
       $tmp = $passages[$j]; 
       $passages[$j] = $passages[$i]; 
       $passages[$i] = $tmp; 
      } else if ($test >= 0) { 
       $tmp = $passages[$i]; 
       $passages[$i] = $passages[$j]; 
       $passages[$j] = $tmp; 
      } 
     } 
    } 

は、機能比較:このランキング機能で

if ($a==$b) return 0; 
    return ($a<$b)?-1:1; 

を、私はネクタイの世話をするために機能を追加しました:

$rank = 1; 
    for ($i = 0; $i < $nbTotal; $i++) { 
      // Si la note du passage actuel est égale à la note du passage précédent, 
      // le classement est égal au classement du passage précédent 
      if ($i > 0 && $passages[$i]['note'] == $passages[$i - 1]['note']) { 
       $passages[$i]['classement'] = $passages[$i - 1]['classement']; 
      } 
      // Sinon le classement est égal à la valeur de $rank 
      else { 
       $passages[$i]['classement'] = $rank; 
      } 
      $rank++; 
    } 

私がテストしました私の関数とそれは、ユーザーIDと 'classement' key = user IDの順で配列された配列を返しています。

は、私が何を得る:

$passages = array(
        array(['id'] => "1" 
         ['username'] => "1124", 
         ['note'] => "22", 
         ['classement'] => "1"), 
        array(['id'] => "2", 
         ['username'] => "1001", 
         ['note'] => "10", 
         ['classement'] => "2"), 
        array(['id'] => "3", 
         ['username'] => "1100", 
         ['note'] => "15", 
         ['classement'] => "3"), 
        array(['id'] => "4", 
         ['username'] => "1120", 
         ['note'] => "5", 
         ['classement'] => "4"), 
        array(['id'] => "5", 
         ['username'] => "1200", 
         ['note'] => "15", 
         ['classement'] => "5") 
      ); 

は、私が欲しいもの:

$passages = array(
        array(['id'] => "2" 
         ['username'] => "1001", 
         ['note'] => "10", 
         ['classement'] => "4"), 
        array(['id'] => "3", 
         ['username'] => "1100", 
         ['note'] => "15", 
         ['classement'] => "2"), 
        array(['id'] => "4", 
         ['username'] => "1120", 
         ['note'] => "5", 
         ['classement'] => "5") 
        array(['id'] => "1", 
         ['username'] => "1124", 
         ['note'] => "22", 
         ['classement'] => "1"), 
        array(['id'] => "5", 
         ['username'] => "1200", 
         ['note'] => "15", 
         ['classement'] => "2") 
      ); 

答えて

1

ステップ1:降順ソート$passagesアレイによるnoteキー

array_multisort(array_column($passages, 'note'), SORT_DESC, SORT_NUMERIC, $passages); 

ステップ2:セットランク

$rank = 1; 
$nbTotal = count($passages); 

for ($i = 0; $i < $nbTotal; $i++) { 
    // Si la note du passage actuel est égale à la note du passage précédent, 
    // le classement est égal au classement du passage précédent 
    if ($i > 0 && $passages[$i]['note'] == $passages[$i - 1]['note']) { 
     $passages[$i]['classement'] = $passages[$i - 1]['classement']; 
    } 
    // Sinon le classement est égal à la valeur de $rank 
    else { 
     $passages[$i]['classement'] = $rank; 
    } 
    $rank++; 
} 

ステップ3:usernameキーで並べ替え$passages配列ascendingly

array_multisort(array_column($passages, 'username'), SORT_ASC, SORT_NUMERIC, $passages); 
+0

どうもありがとう!それは私が欲しかったものです!私のコードは、このソリューションではさらに小さくなりました。 –