Система бейджей и условия хранения в виде переменных?

StackOverflow https://stackoverflow.com/questions/873316

Вопрос

Я пытаюсь написать фрагмент кода, который проверяет статистику пользователей, будь то их очки, ранг или количество друзей, и, в свою очередь, награждает их значком, аналогичным тому, который используется в SO.Система настроена таким образом, что когда пользователь завершает задачу (голосование, комментарий и т. д.), его user_id записывается и ставится в очередь для оценки с 5-минутными интервалами с помощью задания cron.Это самый эффективный способ сделать это?Я видел другой пост о значках, но не уверен, что этот метод был выбран в качестве предпочтительного.

Еще один вопрос, который у меня возникает, касается фактической проверки этих переменных (очков, ранга, количества_друзей) относительно пользователя.У меня есть несколько значков, и я хочу, чтобы администраторы могли добавлять свои собственные, где они выбирают переменную, оператор (==, >= и т. д.) и установленное для него значение.Как мне оценить это в условном операторе IF?Я пробовал использовать SWITCH для операторов, но не смог правильно оценить переменные, например:

function checkbadges($userid,$points,$rank,$friends){
    global $database;

    $q = $database->db_query("SELECT * FROM badges");
    while($bq = $database->db_fetch_assoc($q)) {
        switch($bq[badge_sign]) {
          case "1":
              if($bq[badge_var] == $bq[badge_value])
                  givebadge($userid, $bq[badge_id]);
            break;
          case "2":
              if($bq[badge_var] >= $bq[badge_value]))
                  givebadge($userid, $bq[badge_id]);
            break;
          case "3":
              if($bq[badge_var] <= $bq[badge_value]))
                  givebadge($userid, $bq[badge_id]);
            break;
          case "4":
              if($bq[badge_var] != $bq[badge_value]))
                  givebadge($userid, $bq[badge_id]);
            break;
        }
    }
}

Я думаю, мне нужно использовать eval(), но я не знаю, как это сделать. Любая помощь будет оценена по достоинству!

Это было полезно?

Решение

Если $bq['badge_var'] представляет собой строку, которая является допустимым именем переменной в текущей области действия, вы можете просто сделать это:

$value = ${ $bq['badge_var'] };

Возможно, будет безопаснее и проще расширять, если вы передадите массив в checkbadges() вместо:

function checkbadges($userid,$userdata){
    global $database;
    $q = $database->db_query("SELECT * FROM badges");
    while($bq = $database->db_fetch_assoc($q)) {
        $currentValue = $userdata[ $db['badge_var'] ];
        $requiredValue = $db['badge_value'];
        $issueBadge = false;
        switch($bq['badge_sign']) {
          case "1":
              $issueBadge = ( $currentValue == $requiredValue );  
          break;
          case "2":
              $issueBadge = ( $currentValue >= $requiredValue );  
            break;
          case "3":
              $issueBadge = ( $currentValue <= $requiredValue );  
            break;
          case "4":
              $issueBadge = ( $currentValue != $requiredValue );  
          break;
        }

        if ($issueBadge) {
            givebadge($userid, $bq['badge_id']);
        }
    }
}

где $userdata это что-то вроде этого:

array( 'points' => 1 , 'friends' => 10, 'rank' => 10 );

Затем вы можете расширить доступные переменные, не изменяя функцию.

Другие советы

Каково ожидаемое и наблюдаемое значение переменной, для которой вы не получаете правильное значение?

Кроме того, лучше использовать:

$arr['key']

вместо

$arr[key]

поскольку PHP сначала оценит его как константу, что является плохой практикой, см. Справочник PHP:Массивы

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top