2

我正在尝试编写一段代码来检查用户统计信息,无论是他们的积分、排名还是 num_friends,然后再授予他们类似于 SO 中使用的徽章。系统设置为当用户完成任务(投票、评论等)时,他们的 user_id 会被记录并排队等待 cron 作业以 5 分钟的间隔进行评估。这是最有效的方法吗?我看到了另一篇关于徽章的帖子,但不确定这是否是被选为首选方式的方法。

我的另一个问题是关于实际检查用户的这些变量(点数、排名、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() 但我不确定如何,任何帮助将不胜感激!

4

2 回答 2

3

如果$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 );

然后,您可以在不修改函数的情况下扩展可用变量

于 2009-05-17T17:42:44.473 回答
0

您没有得到正确值的变量的期望值和观察值是哪个?

此外,更好的做法是使用:

$arr['key']

代替

$arr[key]

因为 PHP 将首先将其评估为常量,这是不好的做法,请参阅PHP 参考:数组

于 2009-05-16T23:25:52.310 回答