2

ポイント、ランク、またはnum_friendsなど、ユーザーの統計をチェックし、SOで使用されているものと同様のバッジを授与するコードを作成しようとしています。システムは、タスク (投票、コメントなど) がユーザーによって完了すると、user_id が記録され、cron ジョブによって 5 分間隔で評価されるようにキューに入れられるように設定されています。これはこれを行う最も効率的な方法ですか?バッジに関する他の投稿を見ましたが、これが好ましい方法として選択された方法であるかどうかはわかりません.

私が持っている別の質問は、これらの変数 (ポイント、ランク、num_friends) をユーザーに対して実際にチェックすることです。多数のバッジがあり、管理者が変数、演算子 (==、>= など)、および設定されている値を選択する場所に独自のバッジを追加できるようにしたいと考えています。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() を使用する必要があると思いますが、方法がわかりません。助けていただければ幸いです。

4

2 に答える 2

3

が現在のスコープで有効な変数名である文字列である場合$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 );

その後、関数を変更せずに使用可能な変数を拡張できます

于 2009-05-17T17:42:44.473 に答える
0

正しい値を取得していない変数の期待値と観測値はどれですか?

さらに、以下を使用することをお勧めします。

$arr['key']

それ以外の

$arr[key]

PHPは最初に定数として評価するため、これは悪い習慣です。PHPリファレンス:配列を参照してください。

于 2009-05-16T23:25:52.310 に答える