我正在尝试编写一段代码来检查用户的统计数据,无论是他们的积分、排名还是好友数量,然后授予他们类似于 SO 中使用的徽章。系统设置为当用户完成任务(投票、评论等)时,他们的 user_id 会被记录并排队等待 cron 作业每隔 5 分钟进行评估。这是最有效的方法吗?我看到了另一篇关于徽章的帖子,但不确定这是否是被选为首选方法的方法。
我的另一个问题是关于针对用户实际检查这些变量(分数、排名、 friend 数量)。我有许多徽章,希望允许管理员在选择变量、运算符(==、>= 等)及其设置值的位置添加自己的徽章。如何在 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 );
然后您可以扩展可用变量而不修改函数
关于php - 徽章系统和存储条件作为变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/873316/