php 抽奖接口demo

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/php_lzr/article/details/82901548
不废话 直接上代码 大家可以 借鉴一下 只是接口 没有 页面抽奖页面效果
抽奖概率
public static function get_rand($proArr) { 
    $result = ''; 

    //概率数组的总概率精度
    $proSum = array_sum($proArr); 

    //概率数组循环
    foreach ($proArr as $key => $proCur) { 
        $randNum = mt_rand(1, $proSum); 
        if ($randNum <= $proCur) { 
            $result = $key; 
            break; 
        } else { 
            $proSum -= $proCur; 
        } 
    } 
    unset ($proArr); 

    return $result; 
}
抽奖逻辑
$today_time = strtotime(date('Y-m-d', time()));//当前时间0点
            $count_key = 'guoqing1_rand_count_'.$user_id;
            $todat_count_key = 'guoqing1_rand_count_'.$today_time;
            $rand_count = $redis->scount($count_key);//用户当天的抽奖次数
            $todat_count = $redis->scount($todat_count_key);//当天所有的抽奖次数

            if($rand_count >= $number || $todat_count >= 300) error(23007);//抽奖次数已用完
            $redis->sset($count_key,$operate_time);//记录用户抽奖次数
            $redis->sset($todat_count_key,$operate_time);//记录当天总抽奖次数
            //累计抽中1次后不能中奖
//            $chouzhong_count = $redis->lsize('guoqing1_user_result_'.$user_id);
//            $chouzhong_count = $chouzhong_count ? $chouzhong_count : 0;
            //判断用户是否抽中过奖品 抽中的话 就不能再抽 返回谢谢会惠顾
//            if($chouzhong_count < 1){
                //判断实物奖品是否还有库存  没有的话 中奖记录设为0
                $prize1 = $redis->get('guoqing1_rand_prize1'.$today_time);//查询糖果音乐耳机已抽中数量 总量25个
                $prize1_v = ($prize1 && $prize1==25) ? 0 : 83.3 ;

                $prize2 = $redis->get('guoqing1_rand_prize2'.$today_time);//查询折叠双肩背包已抽中数量
                $prize2_v = ($prize2 && $prize2==18) ? 0 : 60 ;

                $prize3 = $redis->get('guoqing1_rand_prize3'.$today_time);//查询双层真空保温杯已抽中数量
                $prize3_v = ($prize3 && $prize3==18) ? 0 : 60 ;

                $prize4 = $redis->get('guoqing1_rand_prize4'.$today_time);//查询线控自拍杆已抽中数量
                $prize4_v = ($prize4 && $prize4==18) ? 0 : 60 ;

                $prize5 = $redis->get('guoqing1_rand_prize5'.$today_time);//查询月色LED小夜灯已抽中数量
                $prize5_v = ($prize5 && $prize5==11) ? 0 : 36.7 ;

                $prize6 = $redis->get('guoqing1_rand_prize6'.$today_time);//查询腾讯vip会员已抽中数量 总量10个 千分之一
                $prize6_v = ($prize6 && $prize6==210) ? 0 : 700 ;

                //奖池权重设定   中奖率/千分
                $prize_arr = array(
                    '0' => array('id'=>1,'prize'=>'糖果音乐耳机','v'=>$prize1_v),
                    '1' => array('id'=>2,'prize'=>'折叠双肩背包','v'=>$prize2_v),
                    '2' => array('id'=>3,'prize'=>'双层真空保温杯','v'=>$prize3_v),
                    '3' => array('id'=>4,'prize'=>'线控自拍杆','v'=>$prize4_v),
                    '4' => array('id'=>5,'prize'=>'月色LED小夜灯','v'=>$prize5_v),
                    '5' => array('id'=>6,'prize'=>'腾讯vip会员','v'=>$prize6_v),
                );

                //抽奖
                foreach ($prize_arr as $key => $val) {
                    $arr[$val['id']] = $val['v'];
                    $arr1[$val['id']] = $val['id'];
                }

                $rid = jifenTool::get_rand($arr); //根据概率获取奖项id
                unset($prize_arr[$rid-1]['v']);
                $result = $prize_arr[$rid-1];//中奖项

//                查询用户的中奖记录
                $result1 = $redis->lget('guoqing1_user_result_'. $user_id,0,-1);
                if($result1){
                    $new_result = array();
                    foreach($result1 as $key => $val){
                        $val = json_decode($val,1);
                        $new_result[$key]['prize_id'] = $val['prize_id'];
                    }
//                    检测用户抽到的奖品 保证每次用户抽中的产品不一样
                    foreach ($new_result as $k=>$v){
                        foreach ($v as $val){
                            $new_res[] = $val;
                        }
                    }
                    if(in_array($rid,$new_res)){
                        if(count($new_res)>1){
                            unset($arr1[$new_res[0]],$arr1[$new_res[1]]);
                        }else{
                            unset($arr1[$new_res[0]]);
                        }
                        $rid = array_rand($arr1);
                    }
                }

//                //记录中奖的奖品
                if($rid==1){
                    $redis->set('guoqing1_rand_prize1'.$today_time,$prize1!==false ? $prize1+1 : 1);//记录中奖结果
//                    credit_userTool::score($user_id, 11, 20);//送学分
                }
                if($rid==2){
                    $redis->set('guoqing1_rand_prize2'.$today_time,$prize2!==false ? $prize2+1 : 1);
//                    credit_userTool::score($user_id, 11, 30);//送学分
                }
                if($rid==3){
                    $redis->set('guoqing1_rand_prize3'.$today_time,$prize3!==false ? $prize3+1 : 1);
//                    credit_userTool::score($user_id, 11, 50);//送学分
                }
                if($rid==4){
                    $redis->set('guoqing1_rand_prize4'.$today_time,$prize4!==false ? $prize4+1 : 1);
                }
                if($rid==5){
                    $redis->set('guoqing1_rand_prize5'.$today_time,$prize5!==false ? $prize5+1 : 1);
                }
                if($rid==6){
                    $redis->set('guoqing1_rand_prize6'.$today_time,$prize6!==false ? $prize6+1 : 1);
                }
                //记录中奖结果redis
                $my_result = json_encode(array(
                    'user_id' => $user_id,
                    'prize_id' => $rid,
                    'prize' => $prize_arr[$rid - 1]['prize'],
                    'time' => time())
                );
                $redis->lpush('guoqing1_user_result_' . $user_id, $my_result);//中奖用户中奖奖项

                //记录中奖结果mysql
                $info['prize_id'] = $rid;
                $info['user_id'] = $user_id;
                $info['prize'] =  $prize_arr[$rid - 1]['prize'];
                $info['add_time'] = $operate_time;
                $rs = $this->mod('prize')->add($info);

//                *异常处理
                if(!$rs) error(303);
                //组装数据
                foreach ($result as $v){
                    $result['id'] = $rid;
                    $result['prize'] = $prize_arr[$rid - 1]['prize'];
                    $result['rand_count'] = $rand_count+1;
                    $result['prize_id'] = $rs;
                }
                $this->data = $result;
                $this->count = $todat_count+1;

//            }else{
//                $this->data =  array('id'=>7,'prize'=>'谢谢参与','v'=>0);
//            }

猜你喜欢

转载自blog.csdn.net/php_lzr/article/details/82901548