2016-08-04 4 views
0

Ich muss eine Ranking-Funktion vornehmen.Ranking-Funktion mit Krawatte in mehrdimensionalen Array

In meinem $ Passages-Array habe ich "Benutzer", "Benutzername", "Note" und "Classement" -Tasten.

Ich möchte 'Classement' Schlüssel nach "Note" Schlüssel und Reihenfolge Array von "Benutzername" Schlüssel zu ordnen.

Hier ist, was ich versucht:

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; 
      } 
     } 
    } 

Funktion vergleichen:

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

In diesem Ranking-Funktion habe ich eine Funktion Pflege der Beziehungen zu nehmen:

$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++; 
    } 

I getestet Meine Funktion und es gibt ein Array nach Benutzer-ID und mit 'Classement' Schlüssel = Benutzer-ID Reihenfolge zurückgegeben.

Was erhalte ich:

$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") 
      ); 

Was ich will:

$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") 
      ); 

Antwort

1

Schritt 1: Sortieren $passages Array von note Schlüssel absteigend

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

Schritt 2: Set Rang

$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++; 
} 

Schritt 3: Sortieren $passages Array von username Schlüssel ansteigend

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

Vielen Dank! Es ist genau das, was ich wollte! Und mein Code ist jetzt kleiner mit dieser Lösung. –

Verwandte Themen