首页 文章

徽章系统和存储条件作为变量?

提问于
浏览
2

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

我的另一个问题是实际上是针对用户检查这些变量(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 回答

  • 0

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

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

  • 3

    您没有获得正确值的变量的预期值和观察值是多少?

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

    $arr['key']
    

    代替

    $arr[key]
    

    因为PHP会首先将它作为常量进行评估,这是一种不好的做法,请参阅PHP Reference: Arrays

相关问题