sistema di badge e condizioni di conservazione come variabili?
-
22-08-2019 - |
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!
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