以下是项目代码(公众号,使用积分进行抽奖活动),只可做参考:

public function Sncode()
{
$tid = I('request.tid', 0, 'intval'); // 大转盘id,
$wid = I('request.wid', 0, 'intval'); // 应用id,可去掉
$token = $this->getOpenId();       // 获取微信用户的token // 定义数据库
$big_wheel = D('Big_wheel'); // 大转盘设置表
$big_wheel_log = M('big_wheel_log'); // 抽奖记录表
$big_code = M('big_wheel_code'); // 已抽中奖品记录表
    // 查询抽奖活动数据
$where = " `id` = " . $tid;
$list = $big_wheel->relation(true)->where($where)->find(); // 查询积分,若积分不足则无法参与抽奖
$score = $this->duser['score'];
if ($score < $list['score_num']) {
echo json_encode(array('error' => 'score'));
exit;
} //已抽奖总次数
$where_log = "`big_wheel_id`=" . $tid . " and `w_id`=" . $list['w_id'] . " and `code`='" . $token . "'";
$count = $big_wheel_log->where($where_log)->count(); //减去额外获得的抽奖机会 - 分享(此操作暂时隐藏)
$map_share['wid'] = array('eq', $wid);
$map_share['token'] = array('eq', $token);
$map_share['big_wheel_id'] = array('eq', $tid);
$count_share = M('big_wheel_share')->where($map_share)->count();
$count = $count - $count_share; //当日限制次数
if ($list['most_num_times'] > 0) {
$where_log .= " and (addtime BETWEEN " . strtotime(date('Y-m-d 00:00:00')) . " and " . strtotime(date('Y-m-d 23:59:59')) . ")";
$count_today = $big_wheel_log->where($where_log)->count();
$count_today = $count_today - $count_share;// 当日抽奖次数减去额外获得的抽奖次数
    }

    //判断抽奖次数
if ($count_today >= $list['most_num_times'] && $list['most_num_times'] > 0) {
echo json_encode(array('error' => 'invalid_today', 'nums' => $list['most_num_times']));
exit;
} // 扣除积分
M('app_dishop_duser')->where(array('id' => $this->duser['id']))->setDec('score', $list['score_num']); //插入抽奖记录表
$data['big_wheel_id'] = $tid;
$data['w_id'] = $list['w_id'];
$data['code'] = $token;
$data['date'] = date('Y-m-d', time());
$data['addtime'] = time();
$big_wheel_log->add($data); /*
* 奖项数组
* 是一个二维数组,记录了所有本次抽奖的奖项信息,
* 其中id表示中奖等级,prize表示奖品,v表示中奖概率。
* 注意其中的v必须为整数,你可以将对应的 奖项的v设置成0,即意味着该奖项抽中的几率是0,
* 数组中v的总和(基数),基数越大越能体现概率的准确性。
* 本例中v的总和为100,那么中奖概率就是1%,
* 如果v的总和是10000,那中奖概率就是万分之一了。
*
*/
$prize_arr = array(
'0' => array('id' => 1, 'prize' => '1', 'v' => $list['c_probability_one']),
'1' => array('id' => 2, 'prize' => '谢谢参与', 'v' => $list['no_probability']),
'2' => array('id' => 3, 'prize' => '2', 'v' => $list['c_probability_two']),
'3' => array('id' => 4, 'prize' => '3', 'v' => $list['c_probability_three']),
); foreach ($prize_arr as $key => $val) {
$arr[$val['id']] = $val['v'];
} $rid = $this->get_rand($arr); //根据概率获取奖项id $res['yes'] = $prize_arr[$rid - 1]['prize']; //中奖项
unset($prize_arr[$rid - 1]); //将中奖项从数组中剔除,剩下未中奖项
shuffle($prize_arr); //打乱数组顺序
for ($i = 0; $i < count($prize_arr); $i++) {
$pr[] = $prize_arr[$i]['prize'];
} // 若抽中奖品,则存入库中,并返回提示
if ($res['yes'] == '1' || $res['yes'] == '2' || $res['yes'] == '3') {
//这个是保存到数据库表示你这个人抽中奖品
if ($res['yes'] == '1') {
// 查询这是第几次抽中此奖品,若抽中次数大于奖品数,则此次抽中的奖品作废
$code_count = $big_code->where(array('prizetype' => 1, 'big_wheel_id' => $tid))->count();
if ($code_count >= $list['c_num_one']) {
$data = array('prizetype' => null, 'success' => true);
echo json_encode($data);
exit;
}
$code['category'] = $list['c_name_one'];
} elseif ($res['yes'] == '2') {
// 查询这是第几次抽中此奖品,若抽中次数大于奖品数,则此次抽中的奖品作废
$code_count = $big_code->where(array('prizetype' => 2, 'big_wheel_id' => $tid))->count();
if ($code_count >= $list['c_num_two']) {
$data = array('prizetype' => null, 'success' => true);
echo json_encode($data);
exit;
}
$code['category'] = $list['c_name_two'];
} elseif ($res['yes'] == '3') {
// 查询这是第几次抽中此奖品,若抽中次数大于奖品数,则此次抽中的奖品作废
$code_count = $big_code->where(array('prizetype' => 3, 'big_wheel_id' => $tid))->count();
if ($code_count >= $list['c_num_three']) {
$data = array('prizetype' => null, 'success' => true);
echo json_encode($data);
exit;
}
$code['category'] = $list['c_name_three'];
}
$code['sn_id'] = 'sn' . time() . mt_rand(10000, 99999);
$code['w_id'] = $list['w_id'];
$code['big_wheel_id'] = $tid;
$code['prizetype'] = $res['yes'];
$code['code'] = $token;
$code['winners_time'] = time();
$code['state'] = 1;
$big_code->add($code);
$data = array('sn' => $code['sn_id'], 'prizetype' => $res['yes'], 'success' => true);
echo json_encode($data);
exit;
} else {
$data = array('prizetype' => null, 'success' => true);
echo json_encode($data);
exit;
}
}
// 抽奖概率计算
public 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;
}

php 积分抽奖活动(大转盘)的更多相关文章

  1. 利用jQueryRotate旋转插件开发大转盘抽奖

    前言: 公司原来开发大转盘抽奖活动用的是flash 我发现swf文件竟然有6m大,吓尿了! 其实完全可以用js写的,但是自身前端功力有限,且时间紧迫,所以直接用旋转插件就好,兼容各方面都可以保证. 1 ...

  2. asp.net+jQueryRotate开发幸运大转盘

    在线抽奖程序在很多网站上很多,抽奖形式多种多样,Flash抽奖偏多,本文将给大家介绍jQuery转盘抽奖,结合代码实例将使用jQuery和asp.net来实现转盘抽奖程序,为了便于理解,文章贴出实现源 ...

  3. 微信小程序-开心大转盘(圆盘指针)代码分析

    大转盘是比较常见的抽奖活动 .以前做过h5的大转盘,最近小程序比较火,客户要求做小程序的大转盘.我们就来分析下代码.先上几个图:     界面效果还是很不错的. 做界面还是比较容易的,只要有前端基础没 ...

  4. html5简单拖拽实现自动左右贴边+幸运大转盘

    此篇文章主要实现两个功能: 1.点击屏幕下方签到悬浮按钮: 2.弹出幸运大转盘,转盘抽奖签到 效果如图: ​ 在网上找了很多移动端拖拽的js实现方式,大部分都是这一种,html5的touch事件,但是 ...

  5. 小程序 大转盘 抽奖 canvas animation

    项目需求运用到大转盘 可设置概率 可直接自定义结果 效果如下

  6. php中奖概率算法,可用于刮刮卡,大转盘等抽奖算法

    php中奖概率算法,可用于刮刮卡,大转盘等抽奖算法.用法很简单,代码里有详细注释说明,一看就懂 <?php /* * 经典的概率算法, * $proArr是一个预先设置的数组, * 假设数组为: ...

  7. jQuery幸运大转盘_jQuery+PHP抽奖程序的简单实现

    jQuery幸运大转盘_jQuery+PHP抽奖程序的简单实现 在线实例 查看演示 完整代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 ...

  8. jquery——九宫格大转盘抽奖

    一.用到的图片 二.代码如下,重点是js部分 <!DOCTYPE html> <html> <head> <meta http-equiv="Con ...

  9. 快来玩“Gift大转盘”百分百赚好礼

    现在开始到今年的最后一天,你天天都可以来转100%中奖的“ Gift大转盘 ”.代金券.产品折扣.精美纪念礼,没有多余规则.全部网友都可参加,转到就是你赚到,赶快转起来吧! >>活动主页& ...

随机推荐

  1. Docker学习系列之一——安装篇

    一.目的 Docker是目前非常流行的虚拟技术,在云计算领域得到了广泛的应用.国内的阿里.京东等大厂都非常普遍地应用了Docker.本文记录了Docker的基本安装过程及最终运行结果,以期备忘,及和同 ...

  2. List<Map<String, Object>>集合中获取某个key并转换为List<Integer>集合

    package com.codyy.sso.controller.yuanqu; import java.util.ArrayList; import java.util.HashMap; impor ...

  3. Windows和MacOS的比较——不断完善和补充,欢迎吐槽

    1. 鼠标滚轮的方向不一样,Windows上滚轮朝下,页面滚动条也会朝下.而Mac上则相反. 2. Windows上有Home和End键,经常可以Ctrl+Home,Ctrl+End,Ctrl+Shi ...

  4. 级联Cascade

    cascade分为两类: 1.JPA标准 2.Hibernate标准 JPA的方法使用JPA规范 如@OneToMany(cascade=CascadeType.ALL,mappedBy=" ...

  5. Heroku 教程

    中文 https://www.jianshu.com/p/7bc34e56fa39 http://www.bjhee.com/flask-heroku.html 官方 Getting Started ...

  6. mysql集群搭建--韩国庆

    按照我给大家提供的步骤,一步一步来,你就能配好mysql集群环境 什么是mycat 简单的说,MyCAT就是: •一个彻底开源的,面向企业应用开发的“大数据库集群” •支持事务.ACID.可以替代My ...

  7. 正确的学python方式

    首先呢,和其他的各种学习都一样,你一定要明白你学习的目标是什么.有的人想要通过学习Python,转行成程序员,实现行业上的转变:有的人希望通过学习Python,在现有的岗位上提升自己:当然也有很多人只 ...

  8. 网络通信中tcp多客户端连接

    网络编程中的tcp实例太多了,自己也写了好几次(羞愧),今天在想一对一的TCP知道怎么写了,可是一对多的怎么办呢?服务器是如何知道要给那个发送数据呢?做开发的同学应该经常听说uid这个属性.可以为什么 ...

  9. 用python进行有进度条的圆周率计算

    一.安装tqdm函数库 tqdm是一个强大的终端进度条工具,我利用pip获取tqdm函数库. 1.打开运行,输入“cmd” 2.2:输入pip install   你要安装的库(如 pip insta ...

  10. OO第二单元(电梯)单元总结

    OO第一单元(求导)单元总结 这是我们OO课程的第二个单元,这个单元的主要目的是让我们熟悉理解和掌握多线程的思想和方法.这个单元以电梯为主题,从一开始的最简单的单部傻瓜调度(FAFS)电梯到最后的多部 ...