Pergunta

Eu estou tentando escrever um pedaço de código que verifica a usuários estatísticas, seja que os seus pontos, posição ou num_friends e por sua vez prêmios lhes um distintivo semelhante ao utilizado no SO. O sistema é definido de modo quando uma tarefa (votar-se, comentário, etc.) é completado por um usuário, seu user_id é gravado e em fila para serem avaliadas em intervalos de 5 minutos de um trabalho cron. É esta a maneira mais eficiente de fazer isso? Vi outro post sobre emblemas, mas não tenho certeza se este é o método que foi escolhida como a forma preferida.

Outra questão que tenho é sobre realmente verificar estas variáveis ??(pontos, grau, num_friends) contra o usuário. Eu tenho um número de emblemas e quer permitir que os administradores para adicionar seu próprio onde eles selecionar uma variável, o operador (==,> =, etc.) e o valor é ajustado para. Como posso avaliar que em uma instrução condicional IF? Eu tentei usar o switch para os operadores, mas não é possível obter as variáveis ??a serem avaliadas corretamente, como:

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;
        }
    }
}

Eu acho que eu tenho que usar eval (), mas eu não sei como, qualquer ajuda seria apreciada!

Foi útil?

Solução

Se $bq['badge_var'] é uma string que é um nome de variável válido no escopo atual, você pode simplesmente fazer isso:

$value = ${ $bq['badge_var'] };

Pode ser mais seguro e mais fácil de estender se você passar um array para checkbadges() vez:

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']);
        }
    }
}

onde $userdata é algo como isto:

array( 'points' => 1 , 'friends' => 10, 'rank' => 10 );

Você pode então estender as variáveis ??disponíveis sem modificar a função

Outras dicas

Qual é o valor esperado eo valor observado da variável que não estão recebendo o valor correto para?

Além disso, a sua melhor prática para usar:

$arr['key']

em vez de

$arr[key]

como PHP irá avaliá-lo primeiro como uma constante que é uma prática ruim, veja PHP Referência: Arrays

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top