2022 PHP抽奖新方法,支持开启多通道抽取
Posted 哈尔滨洛弘科技有限公司
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2022 PHP抽奖新方法,支持开启多通道抽取相关的知识,希望对你有一定的参考价值。
模拟下真实奖品盒抽取场景
抽奖盒中会放入N个小球,在里面选取几个小球做为中奖的小球。
抽取模式可以分为
抽到小球后将抽中的小球销毁
抽到小球后将抽中的小球放回继续参与抽奖
了解抽奖盒的模式后我们上代码
//此处用的是自定义的缓存机制,大家如果用框架可以换成相应的缓存机制(thinkphp 可以换成 cache())
$this->name='';
$this->probability=0;
$this->prize=1;
/**
* @param $name /奖池名称
* @param $probability /概率
* @param $prize /奖品库 需要中奖的随机数 数组
* @return $this
* 创建奖池/重置已经存在的奖池
*/
public function create_draw($probability = 1 / 1000, $name = 'draw', $prize = 1)
$this->name=$name;
$this->probability=$probability;
$this->prize=is_array($prize) ? $prize : [$prize]);
Init::cache()->has($name) ?: Init::cache()->set($name, []);
return $this;
/**
* @param int $type 1 取出不放回 2取出放回
* @param int $num 取出后放回的次数
* @return bool|int
* 执行抽奖
*/
public function query_draw($type = 1, $num = 0)
if ($this->probability == 0) return false;
$cache = Init::cache();
//拉取奖池数据
$draw_data = $cache->get($this->name);
//获取奖池总奖数
$total = 1 / $this->probability;
//随机抽取
$key = rand(1, $total);
if (!in_array($key, $this->prize)) return false;
if ($type == 1 && !in_array($key, $draw_data)) return false;
if ($type == 2 && $num > 0 && array_count_values($draw_data)[$key] >= $num) return false;
array_push($draw_data, $key);
$cache->set($this->name, $draw_data);
return $key;
/**
* 获取奖池数据
*/
public function get_draw_data($name = 'draw')
return Init::cache()->get($name);
/**
* @param string $draw_name
* @return bool
* 清除抽奖缓存
*/
public function undraw($draw_name = 'draw')
return Init::cache()->delete($draw_name);
哈尔滨洛弘科技实战代码分享,喜欢的可以一起探讨哦
以上是关于2022 PHP抽奖新方法,支持开启多通道抽取的主要内容,如果未能解决你的问题,请参考以下文章