Domanda

Sto cercando di scrivere un pezzo di codice che controlla uno Statistiche degli, essere che la loro punti, rango o num_friends ea sua volta premi loro un distintivo simile a quello utilizzato in SO. Il sistema è impostato in modo che quando un compito (votare fino, commentare, ecc), è completato da un utente, il suo user_id viene registrato e in coda per essere valutato a 5 min intervalli da un job cron. È questo il modo più efficace di fare questo? Ho visto l'altro post su badge, ma non sono sicuro se questo è il metodo che è stato selezionato come il modo preferito.

Un'altra domanda che ho è circa in realtà controllando queste variabili (punti, rango, num_friends) contro l'utente. Ho un certo numero di badge e voglio permettere agli amministratori di aggiungere il proprio dove si seleziona una variabile, l'operatore (==,> =, etc.) e il valore è impostato su. Come faccio a valutare che in un'istruzione condizionale IF? Ho provato con l'interruttore per gli operatori, ma non riesco a ottenere le variabili da valutare in modo corretto, come:

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

Credo che devo usare eval (), ma non sono sicuro di come, tutto l'aiuto sarebbe apprezzato!

È stato utile?

Soluzione

Se $bq['badge_var'] è una stringa che è un nome di variabile valido nell'ambito corrente, si può semplicemente fare questo:

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

Potrebbe essere più sicuro e più facile da estendere, se si passa un array per checkbadges() invece:

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

dove $userdata è qualcosa di simile:

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

È possibile quindi estendere le variabili disponibili senza modificare la funzione

Altri suggerimenti

Qual è il valore atteso e il valore osservato della variabile non si è trovato il giusto valore per?

Inoltre, la sua pratica meglio utilizzare:

$arr['key']

anziché

$arr[key]

PHP valuterà in primo luogo come una costante che è una cattiva pratica, vedere PHP Riferimento: Array

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top