Bestimmen Sie das Level anhand der Benutzerpunkte
<code>lv1:1~50 lv2:51~110 lv3:111~180 lv4:181~260 ...... 依次类推直到lv100</code>
Wie lässt sich das Niveau anhand der Punkte des Benutzers schnell und effizient ermitteln? Es ist in Ordnung, ein paar Daten zu beurteilen, aber wenn es 100 Ifs gibt, sinkt die Effizienz. Hat jemand gute Methoden?
Bestimmen Sie das Level anhand der Benutzerpunkte
<code>lv1:1~50 lv2:51~110 lv3:111~180 lv4:181~260 ...... 依次类推直到lv100</code>
Wie lässt sich das Niveau anhand der Punkte des Benutzers schnell und effizient ermitteln? Es ist in Ordnung, ein paar Daten zu beurteilen, aber wenn es 100 Ifs gibt, sinkt die Effizienz. Hat jemand gute Methoden?
Ich bin wirklich dankbar, dass alle sehr aktiv dabei sind, mir bei der Lösung dieses Problems zu helfen. Diese Spalte heißt „Antworten schreiben“ und ist eigentlich keine Antwort, sondern entspricht lediglich meinen Bedürfnissen.
Diese Lösung besteht eigentlich darin, das Level des Benutzers anhand der Online-Zeit des Benutzers zu beurteilen und nach Ablauf einer bestimmten Zeit auf ein bestimmtes Level zu aktualisieren. Später wurde beschlossen, diese Methode zu verwenden, um die Level-Zeit des Benutzers zu beurteilen Das Quadrat des aktuellen Levels ist die Anzahl der für das Level erforderlichen Stunden.
Finden Sie abschließend die Benutzerebene anhand der Dauer
<code class="php">(int)sqrt($onlinetime)+1;</code>
<code><?php function getLevel($point) { $level = 0; while($point >= 0) { $point -= 50 + $level++ * 10; } return $level; }</code>
Es wird empfohlen, Informationen auf Benutzerebene direkt in der Datenbank zu verwalten und zu speichern, andernfalls kann die Verwendung von SQL für einfache Bereichsabfragen dazu führen, dass Ihr Index fehlschlägt.
Wenn die Daten unregelmäßig sind und Sie sie nicht in der Datenbank speichern möchten, verwenden Sie eine binäre Suche, um die Obergrenze der Punkte für die mittlere Ebene aller Ebenen zu ermitteln Suchen Sie dann rekursiv nach einer höheren Stufe als dieser Stufe. Andernfalls suchen Sie rekursiv nach einer höheren Stufe als dieser mittleren Stufe. .
Der „Punkte/50-Algorithmus“ in den Kommentaren kann die Punktebewertung des Posters offensichtlich nicht erfüllen, da sich die Punktestufenregeln ändern können und der Algorithmus selbst Probleme hat.
Die Suche nach geordneten Daten kann mit der Binärmethode durchgeführt werden. Ich gebe Ihnen einen einfachen Implementierungscode
<code><?php /** * 二分法查找 * * @param int $score 积分 * @param array $filter 积分规则 * * @return array $filter */ function search($score, $filter) { $half = floor(count($filter) / 2); // 取出中間数 // 判断积分在哪个区间 if ($score <= $filter[$half - 1]['max']) { $filter = array_slice($filter, 0 , $half); } else { $filter = array_slice($filter, $half , count($filter)); } // 继续递归直到只剩一个元素 if (count($filter) != 1) { $filter = search($score, $filter); } return $filter; } $filter = [ ['level' => 1, 'min' => 1, 'max' => 50], ['level' => 2, 'min' => 51, 'max' => 110], ['level' => 3, 'min' => 111, 'max' => 180], ['level' => 4, 'min' => 181, 'max' => 260], ['level' => 5, 'min' => 261, 'max' => 500], ]; $result = search(240, $filter); echo current($result)['level']; </code>
1. Fügen Sie jedes Mal, wenn ein neuer Punkt hinzugefügt wird, 1 hinzu. Dies ist eine Echtzeitlösung
2. Wenn die Verzögerung beim Levelaufstieg zulässig ist, wird empfohlen, geplante Aufgaben oder asynchrone Warteschlangen zur Verarbeitung von Berechnungen zu verwenden, da die Punkte auf lange Sicht ziemlich belastet sein können, was als im Voraus geplant gilt
Ich denke, wenn Sie dies wirklich tun möchten, um Ebenen durch Punkte zu erhalten, wird empfohlen, alle Schlüssel-Wert-Paare direkt zu definieren und Platz für den Zeitaustausch zu verwenden. Die eigentliche Geschäftslogik hat nicht viele Ebenen und erfordert überhaupt keine Algorithmen. Dies ist der leistungsstärkste Ansatz. Sie können den Code zum Generieren dieses Arrays selbst schreiben
$arr[1]=“lv1“;$arr[2]=“lv1“;......$arr [50 ]="lv1";
$arr[51]="lv2";$arr[52]="lv2";....$arr[110]="lv2";
...
...
...
...
Was ist mit den Regeln? Ohne Regeln gibt es keine Regel
= = Die erste Idee war, die switch-Anweisung zu verwenden. Nachdem ich mir den zweiten Stock angesehen hatte, hatte ich das Gefühl, dass ich niedrig war und weiter lernen musste
Verwenden Sie eine Datenbank, sie ist zuverlässiger. Die Leistung von Schleifen und ob Urteile nicht getroffen werden. Die Datenbank speichert 100 kleine Datenfälle und ist einfach abzufragen. Darüber hinaus ist das Muster Ihrer Daten nicht für die Beurteilung im Programm geeignet.
Die erste Lösung habe ich oben übernommen
$rules = array(
<code>[1]=>array(1,50), [2]=>array(51,110), [3]=>array(111,180)</code>
99 Punkte
Das Array durchlaufen
foreach($rules as $k=>$v){
<code>if($v[1]<99<$v[2]){ //这里可以取出等级 }</code>
<code class="php">function getLevel($point) { $level = [ 0 => ['max' => 1000, 'min' => 0, 'name' => '新手', 'level' => 1], 1 => ['max' => 10000, 'min' => 1000, 'name' => '小将', 'level' => 2], 2 => ['max' => 20000, 'min' => 10000, 'name' => '中将', 'level' => 3], 3 => ['max' => 50000, 'min' => 20000, 'name' => '上将', 'level' => 4], 4 => ['max' => 100000, 'min' => 50000, 'name' => '大将', 'level' => 5], 5 => ['max' => 999999999, 'min' => 100000, 'name' => '将军', 'level' => 6], ]; foreach ($level as $value) { if (($point >= $value['min']) && ($point < $value['max'])) { return $value; } } }</code>
效率不高,期待更好算法。
<code>public function gradefun($gf)//用户等级函数 { $arr = array(120000 => 12, 80000 => 11, 50000 => 10, 30000 => 9, 12000 => 8, 8000 => 7, 5000 => 6, 2500 => 5, 1200 => 4, 500 => 3, 100 =>2, 0 => 1); foreach ($arr as $key => $value) { if ($gf >= $key) { return $value; } } } 这个可以解决等级数小的,大的不清楚,没用过。</code>