我正在尝试编写一段代码来检查用户统计信息,无论是他们的积分,等级还是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(),但我不确定如何,任何帮助都会受到赞赏!
答案 0 :(得分: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 );
然后,您可以在不修改函数的情况下扩展可用变量
答案 1 :(得分:0)
您未获得正确值的变量的预期值和观察值是什么?
此外,更好的做法是使用:
$arr['key']
而不是
$arr[key]
因为PHP会首先将它作为常量进行评估,这是一种不好的做法,请参阅PHP Reference: Arrays