PHP+MYSQL简单实现九宫格随机抽奖

5 篇文章 0 订阅
1 篇文章 0 订阅

一、设计九宫格抽奖界面
二、制定抽奖商品和概率
三、发送抽奖请求
四、后台为概率实现随机数组
五、抽奖结果返回
六、后续操作

代码详解:

一、设计九宫格抽奖界面

以下为百度中的某图,仅为借鉴,侵删
在这里插入图片描述

二、制定抽奖商品和概率

假定:九宫格中从上到下从左到右的商品为:

//概率为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.其他自定义操作,略

<!--结束,谢谢,再见-->
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ScorpionFong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值