much better ranking
authorChristian Weiske <cweiske@cweiske.de>
Tue, 14 Jan 2020 21:23:16 +0000 (22:23 +0100)
committerChristian Weiske <cweiske@cweiske.de>
Tue, 14 Jan 2020 21:23:16 +0000 (22:23 +0100)
bin/filters.php
bin/import-game-data.php

index 703114a2410fa9e65f88aec8d3c2e499379fa9a8..04a998f2b985259ba00874281faafc1653109d81 100644 (file)
@@ -84,7 +84,7 @@ function filterBestRated($origGames, $limit)
     usort(
         $games,
         function ($gameA, $gameB) {
-            return $gameB->rating->average - $gameA->rating->average;
+            return ($gameB->rating->rank - $gameA->rating->rank) * 100;
         }
     );
 
index 2d0076e13af2f70a0bfde9fb9f5412a6e60d2b1f..467dac53d57ebf54270681856b72c82ab469e4e9 100755 (executable)
@@ -98,6 +98,8 @@ foreach ($gameFiles as $gameFile) {
     }
 }
 
+calculateRank($games);
+
 foreach ($developers as $developer) {
     writeJson(
         //index.htm does not need a rewrite rule
@@ -733,6 +735,29 @@ function addMissingGameProperties($game)
     }
 }
 
+/**
+ * Implements a sensible ranking system described in
+ * https://stackoverflow.com/a/1411268/2826013
+ */
+function calculateRank(array $games)
+{
+    $averageRatings = array_map(
+        function ($game) {
+            return $game->rating->average;
+        },
+        $games
+    );
+    $average = array_sum($averageRatings) / count($averageRatings);
+    $C = $average;
+    $m = 500;
+
+    foreach ($games as $game) {
+        $R = $game->rating->average;
+        $v = $game->rating->count;
+        $game->rating->rank = ($R * $v + $C * $m) / ($v + $m);
+    }
+}
+
 function getFirstVideoUrl($media)
 {
     foreach ($media as $medium) {