Система бейджей и условия хранения в виде переменных?
-
22-08-2019 - |
Вопрос
Я пытаюсь написать фрагмент кода, который проверяет статистику пользователей, будь то их очки, ранг или количество друзей, и, в свою очередь, награждает их значком, аналогичным тому, который используется в SO.Система настроена таким образом, что когда пользователь завершает задачу (голосование, комментарий и т. д.), его user_id записывается и ставится в очередь для оценки с 5-минутными интервалами с помощью задания cron.Это самый эффективный способ сделать это?Я видел другой пост о значках, но не уверен, что этот метод был выбран в качестве предпочтительного.
Еще один вопрос, который у меня возникает, касается фактической проверки этих переменных (очков, ранга, количества_друзей) относительно пользователя.У меня есть несколько значков, и я хочу, чтобы администраторы могли добавлять свои собственные, где они выбирают переменную, оператор (==, >= и т. д.) и установленное для него значение.Как мне оценить это в условном операторе 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 );
Затем вы можете расширить доступные переменные, не изменяя функцию.
Другие советы
Каково ожидаемое и наблюдаемое значение переменной, для которой вы не получаете правильное значение?
Кроме того, лучше использовать:
$arr['key']
вместо
$arr[key]
поскольку PHP сначала оценит его как константу, что является плохой практикой, см. Справочник PHP:Массивы