Rozet sistemi ve değişkenleri olarak saklama koşullarında?

2 Cevap php

Ben olmak, bir kullanıcılar istatistikleri kontrol kodu bir parça yazmaya çalışıyorum onların noktaları, rütbe veya num_friends ve dönüş ödül onları SO kullanılan benzer bir rozet. Sistem, bir görev (vb, yorum, kadar oy) bir kullanıcı tarafından tamamlandığında, onların User_id kaydedilir şekilde ayarlanır ve bir cron işi ile 5 dk aralıklarla değerlendirilmelidir için sıraya. Bu yapmanın en etkili yolu nedir? Ben rozetleri hakkında diğer yazı gördüm ama bu tercih edilen bir yol olarak seçildi yöntemi ise emin değilim.

Ben başka bir soru aslında kullanıcıya karşı bu değişkenleri (sayı, rütbe, num_friends) kontrol ilgili. Ben rozetleri bir dizi var ve onlar bir değişken seçin nerede yöneticileri kendi eklemek için izin istiyor, operatör (==,> =, vb) ve değeri, ayarlanmış oluyor. Bunu nasıl bir IF koşullu açıklamada değerlendiriyorsunuz? Ben operatörler için anahtar kullanmadan çalıştı ama değişkenlerin doğru değerlendirilmelidir alınamıyor gibi:

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

Ben (eval kullanmak zorunda düşünüyorum) ama herhangi bir yardım mutluluk duyacağız nasıl, emin değilim!

2 Cevap

$bq['badge_var'] Geçerli kapsamda geçerli bir değişken adı olan bir dize ise, sadece bunu yapabilirsiniz:

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

Bu checkbadges() yerine bir dizi geçmesi halinde uzatmak için daha güvenli ve daha kolay olabilir:

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

burada $userdata bu gibi bir şeydir:

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

Daha sonra işlevini değiştirmeden kullanılabilir değişkenler uzatabilirsiniz

Beklenen değeri ve sizin için doğru değeri almıyorsanız değişkenin gözlenen değeri hangisidir?

Ayrıca, onun daha iyi bir uygulama kullanmak için:

$arr['key']

yerine

$arr[key]

PHP kötü bir uygulama olan sabit bir ilk olarak değerlendirecek gibi görmek PHP Reference: Arrays