> 백엔드 개발 > PHP 튜토리얼 > PHP는 어떻게 사용자 포인트를 기반으로 사용자 레벨을 신속하게 결정합니까?

PHP는 어떻게 사용자 포인트를 기반으로 사용자 레벨을 신속하게 결정합니까?

WBOY
풀어 주다: 2016-08-04 09:21:26
원래의
3636명이 탐색했습니다.

사용자 포인트에 따른 레벨 결정

<code>lv1:1~50
lv2:51~110
lv3:111~180
lv4:181~260
......
依次类推直到lv100</code>
로그인 후 복사
로그인 후 복사

사용자의 포인트에 따라 레벨을 빠르고 효율적으로 결정하는 방법은 무엇입니까? 만약에 몇개의 데이터로 판단하면 괜찮지만 100개의 if가 있으면 효율이 떨어지겠죠.. 혹시 좋은 방법 있으신가요?

답글 내용:

사용자 포인트에 따른 레벨 결정

<code>lv1:1~50
lv2:51~110
lv3:111~180
lv4:181~260
......
依次类推直到lv100</code>
로그인 후 복사
로그인 후 복사

사용자의 포인트에 따라 레벨을 빠르고 효율적으로 결정하는 방법은 무엇입니까? 만약에 몇개의 데이터로 판단하면 괜찮지만 100개의 if가 있으면 효율이 떨어지겠죠.. 혹시 좋은 방법 있으신가요?

이 문제를 해결하는 데 모두가 적극적으로 도움을 주는 모습을 보니 정말 감사합니다. 이 칼럼은 "Write Answers"라고 불리며 실제로는 답변이 아니며 단지 내 요구 사항을 충족할 뿐입니다.
이 솔루션은 실제로 사용자의 온라인 시간을 기준으로 사용자의 레벨을 판단하고, 일정 시간이 지나면 특정 레벨로 업그레이드하는 것입니다. 나중에 이 방법을 사용하여 사용자의 레벨 시간을 판단하기로 결정했습니다. 현재 레벨의 제곱은 다음 레벨에 필요한 시간입니다.
마지막으로 기간을 기준으로 사용자 레벨을 찾습니다

<code class="php">(int)sqrt($onlinetime)+1;</code>
로그인 후 복사

PHP는 어떻게 사용자 포인트를 기반으로 사용자 레벨을 신속하게 결정합니까?

<code><?php
function getLevel($point) {
    $level = 0;
    while($point >= 0) {
        $point -= 50 + $level++ * 10;
    }
    return $level;
}</code>
로그인 후 복사

사용자 수준 정보를 데이터베이스에 직접 유지하고 저장하는 것이 좋습니다. 그렇지 않으면 단순 범위 쿼리 SQL을 사용하면 인덱스가 실패할 수 있습니다.

데이터가 불규칙하고 데이터베이스에 저장하고 싶지 않다면 이진 검색을 사용하여 모든 레벨의 중급에 대한 포인트의 상한선을 찾으십시오. 사용자의 포인트가 이 상한선보다 클 경우. , 이 수준보다 큰 수준을 재귀적으로 검색합니다. 그렇지 않으면 이 중간 수준보다 높은 수준을 재귀적으로 검색합니다. .

댓글에 있는 '포인트/50 알고리즘'은 분명히 게시자의 포인트 수준 판단을 만족시킬 수 없습니다. 포인트 수준 규칙이 변경될 수 있고 알고리즘 자체에 문제가 있기 때문입니다.

순서화된 데이터 검색은 바이너리 방식을 이용하여 수행할 수 있습니다. 간단한 구현코드를 알려드리겠습니다

<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. 사용자 테이블에 중복 레벨 필드를 추가합니다. 새로운 포인트가 추가될 때마다 부수적으로 판단됩니다. 레벨이 향상되면 1을 추가합니다.

2. 레벨 승격 지연이 허용되는 경우 사전에 계획된 것으로 간주되는 장기적으로 포인트가 상당히 로드될 수 있으므로 예약된 작업이나 비동기 대기열을 사용하여 계산을 처리하는 것이 좋습니다

꼭 이렇게 해서 포인트를 통해 레벨을 올리고 싶다면 모든 키-값 쌍을 직접 정의하고 공간을 활용해 시간을 교환하는 것이 좋다고 생각합니다. 실제 비즈니스 로직에는 레벨이 많지 않으며 알고리즘이 전혀 필요하지 않습니다. 이것이 가장 성능이 좋은 접근 방식입니다.
$arr[1]=“lv1”;$arr[2]=“lv1”;.....$arr [50 ]="lv1";
$arr[51]="lv2";$arr[52]="lv2";...$arr[110]="lv2";
...
...
...
...

규칙은 어떻게 되나요? 규칙이 없으면 규칙도 없습니다

= = 첫 번째 아이디어는 스위치 문을 활용하는 것이었습니다. 2층을 보고 나니 실력이 부족하고 계속 학습해야겠다는 생각이 들었습니다.

데이터베이스를 사용하면 더 안정적입니다. 루프의 성능과 판단에 도달하지 못한 경우. 데이터베이스는 100개의 작은 데이터 케이스를 저장하며 쿼리하기 쉽습니다. 또한, 귀하의 데이터 패턴은 프로그램의 판단에 적합하지 않습니다.

위층에서 첫 번째 솔루션을 채택했습니다

$rules = 배열(

<code>[1]=>array(1,50),
[2]=>array(51,110),
[3]=>array(111,180)</code>
로그인 후 복사

)
99포인트
배열 탐색
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>
로그인 후 복사
관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿