不废话 直接上代码 大家可以 借鉴一下 只是接口 没有 页面抽奖页面效果
抽奖概率
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);
// }
php 抽奖接口demo
最新推荐文章于 2025-04-17 11:31:10 发布