Система значков и сохранение условий в качестве переменных? - PullRequest
2 голосов
/ 17 мая 2009

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

Другой вопрос, который у меня есть, касается проверки этих переменных (points, rank, num_friends) у пользователя. У меня есть несколько значков, и я хочу разрешить администраторам добавлять свои собственные, где они выбирают переменную, оператор (==,> = и т. Д.) И значение, которое оно установило. Как я могу оценить это в условном утверждении 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 (), но я не уверен, как, любая помощь будет признательна!

Ответы [ 2 ]

3 голосов
/ 17 мая 2009

Если $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 );

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

0 голосов
/ 17 мая 2009

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

Кроме того, рекомендуется использовать:

$arr['key']

вместо

$arr[key]

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

...