一、设计九宫格抽奖界面
二、制定抽奖商品和概率
三、发送抽奖请求
四、后台为概率实现随机数组
五、抽奖结果返回
六、后续操作
代码详解:
一、设计九宫格抽奖界面
以下为百度中的某图,仅为借鉴,侵删
二、制定抽奖商品和概率
假定:九宫格中从上到下从左到右的商品为:
//概率为0-100,对应0%-100%
//原则上8种商品的概率相加应为100,可设置一种商品为谢谢参与
[
['id'=>1,'name'=>'商品1','gailv'=>10,'img'=>'图片url'],
['id'=>2,'name'=>'商品2','gailv'=>3,'img'=>'图片url'],
['id'=>3,'name'=>'商品3','gailv'=>2,'img'=>'图片url'],
['id'=>4,'name'=>'商品4','gailv'=>0,'img'=>'图片url'],//永远中不了的商品
['id'=>5,'name'=>'商品5','gailv'=>6,'img'=>'图片url'],
['id'=>6,'name'=>'商品6','gailv'=>1,'img'=>'图片url'],
['id'=>7,'name'=>'商品7','gailv'=>20,'img'=>'图片url'],
['id'=>8,'name'=>'谢谢参与','gailv'=>58,'img'=>'图片url'],//谢谢参与的商品
]
三、发送抽奖请求
前端点击抽奖按钮,向后端发送抽奖请求,注意用户区分
四、后台为概率实现随机数组
1.生成1-100所有的数字并返回数组$a
2.把每个商品的对应概率的数字个数放入商品的概率中并生成新的概率字段:gailv_num
因为有概率为0的商品,所以直接将概率为0的商品的gailv_num设置为999,保证任何时候都无法中得
3.再次从1-100中生成一个中奖数字,例:55
4.将55与各个商品中的字段gailv_num中的数字进行对比,若其中一个商品中有55则中得
代码的简单实现:
public function test(){
$goods = [
['id'=>1,'name'=>'商品1','gailv'=>10,'img'=>'图片url'],
['id'=>2,'name'=>'商品2','gailv'=>3,'img'=>'图片url'],
['id'=>3,'name'=>'商品3','gailv'=>2,'img'=>'图片url'],
['id'=>4,'name'=>'商品4','gailv'=>0,'img'=>'图片url'],//永远中不了的商品
['id'=>5,'name'=>'商品5','gailv'=>6,'img'=>'图片url'],
['id'=>6,'name'=>'商品6','gailv'=>1,'img'=>'图片url'],
['id'=>7,'name'=>'商品7','gailv'=>20,'img'=>'图片url'],
['id'=>8,'name'=>'谢谢参与','gailv'=>58,'img'=>'图片url'],//谢谢参与的商品
];
//中奖数字
$zhongjiang_num = mt_rand(1, 100); //例:55
//读取商品概率
foreach($goods as $v){
$gailv[] = $v['gailv'];
}
//计算概率总数:此处原则上总数为100,但是不排除有没有谢谢参与这种商品的情况,所以兼容各种概率设定
$num_count = array_sum($gailv);
//生成1到100个数字并组成数组
for($i=1;$i<=100;$i++){
$a[] = $i;
}
//从数组中选出指定个数的随机数并返回键
$b = array_rand($a,$num_count);
//由于array_rand读取出的数组中的键,所以多一步将键转化为值的过程
foreach($b as $v){
$c[] = $a[$v];
}
//打乱数组排序
shuffle($c);
foreach($goods as $k => $v){
//如果概率不是0
if($v['gailv'] > 0){
$num_sub = [];
if($v['gailv'] > 1){
$num_sub_key = array_rand($c,$v['gailv']);
foreach($num_sub_key as $vv){
$num_sub[] = $c[$vv];
unset($c[$vv]);
}
}else{
$num_sub_key = array_rand($c);
$num_sub[] = $c[$num_sub_key];
unset($c[$num_sub_key]);
}
$c = array_values($c);
$goods[$k]['gailv_num'] = $num_sub;
}else{
//永远中不到的商品的值设为999,永远匹配不到
$goods[$k]['gailv_num'][] = 999;
}
}
//检测商品是否中奖了
foreach($goods as $v){
if(in_array($zhongjiang_num, $v['gailv_num'])){
//恭喜您中奖了,虽然中的可能是谢谢参与
return $v['id'];//返回中奖的商品ID
}
}
//此处可加入商品库存检测,代码略
//一个都没中,当有谢谢参与的商品时,走不到这里,只有概率相加小于100时,可能走到这里
return FALSE;
}
五、抽奖结果返回
根据返回的商品ID,前端做出中奖之后的效果
当有谢谢参与商品时,建议在数据库中做出特殊标识或其他方式提示前端,以便前端区分
六、后续操作
后续大概几个步骤:
1.用户中奖纪录
2.发货及发货纪录
3.前端滚动提示所有用户有人中奖了(排除谢谢参与)
4.减少商品库存
5.其他自定义操作,略
<!--结束,谢谢,再见-->