php中array_rand函数的使用方法详解

 更新时间:2016年11月25日 15:35  点击:2193
array_rand是数组随机函数了,我今天看到一个站长简单的介绍array_rand性能了,于是把许久没写的php再来简单的看看,我们一起来看看array_rand函数用法吧。


从一个数组中随机取出n个值,用array_rand()可以轻易的实现,当面对大数组的时候,我们会担心他的效率、性能问题。

我测试了一下,当在一个大小为一万的数组中随机取出20个值,即array_rand($arr, 20)的时候,程序只花费了0.005s左右,效率非常高。平时基本上都不会遇到这么大的数组吧,所以我们不必担心array_rand效率问题了。

同时,我用了另外一种用随机数的方法。

$arr = array(1,2,3,4,5...9999);
for($i=0; $i<20; $i++)
{
 $rands = mt_rand(0,9999);
 $aa[] = $arr[$rands];
}

运行程序,也只需要大概0.005s左右。

实例、随机数组

function make_password( $length = 8 )
{
    // 密码字符集,可任意添加你需要的字符
    $chars = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
    'i', 'j', 'k', 'l','m', 'n', 'o', 'p', 'q', 'r', 's',
    't', 'u', 'v', 'w', 'x', 'y','z', 'A', 'B', 'C', 'D',
    'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L','M', 'N', 'O',
    'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y','Z',
    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '!',
    '@','#', '$', '%', '^', '&', '*', '(', ')', '-', '_',
    '[', ']', '{', '}', '<', '>', '~', '`', '+', '=', ',',
    '.', ';', ':', '/', '?', '|');

    // 在 $chars 中随机取 $length 个数组元素键名
    $keys = array_rand($chars, $length);

    $password = '';
    for($i = 0; $i < $length; $i++)
    {
        // 将 $length 个数组元素连接成字符串
        $password .= $chars[$keys[$i]];
    }

    return $password;
}

我猜想,array_rand底层的算法可能就是以上这种方法做出来的。所以取数组中随机值,放心大胆的用array_rand吧。

微信自动登录并获取昵称是可以通过api接口来获取的也是通过微信开放的接口来实现了,下面我们一起来看一个例子

 

仅记录:微信获取昵称自动登录
经过反复几次验证,发现我这个方法有缺陷:
微信内 未关注进入网站,无法获得昵称。
关注后用我这个方法可以获得昵称。
是否是因为第一次生成openid 所以还未生成昵称?待测试。
/**
* 获取当前页面完整URL地址
*/
function get_url() {
$sys_protocal = isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == '443' ? 'https://' : 'http://';
$php_self = $_SERVER['PHP_SELF'] ? $_SERVER['PHP_SELF'] : $_SERVER['SCRIPT_NAME'];
 
$path_info = isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : '';
$relate_url = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : $php_self.(isset($_SERVER['QUERY_STRING']) ? '?'.$_SERVER['QUERY_STRING'] : $path_info);
return $sys_protocal.(isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : '').$relate_url;
}
 
 
$wxch_config = $db -> getRow("SELECT * FROM `ecs_weixin_config` WHERE `id` = 1");
$appid = $wxch_config['appid'];
$appsecret = $wxch_config['appsecret'];
 
$APPID = $appid;
$SCRETID =$appsecret;
 
if(!$_SESSION['user_id'] && strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger') !== false){
 
 
 
 
 
 
if (!isset($_GET['code']))
{
 
$backurl = get_url();
//$url = $jsApi->createOauthUrlForCode($backurl);
$url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=".$APPID."&redirect_uri=".urlencode($backurl)."&response_type=code&scope=snsapi_base&state=123#wechat_redirect";
//echo $url;
Header("Location: $url");
}else
{
//获取code码,以获取openid
$code = $_GET['code'];
 
$url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=".$APPID."&secret=".$SCRETID."&code=".$code."&grant_type=authorization_code";
$re = curl_get_contents1($url);
$rearr = json_decode($re,true);
$openid = $rearr['openid'];
 
 
 
 
//var_dump($rearr);
//$jsApi->setCode($code);
//$openid = $jsApi->getOpenid();
 
$user_name = $db->getOne("select uname from ecs_weixin_user where wxid = '{$openid}'");
 
if($openid && !$user_name){ //注册进入
$passw = md5('shanmao.me'.rand(1,18650144002));
$wxch_user_sql = "INSERT INTO `ecs_weixin_user` (`wxid`,`setp`) VALUES ('$openid','3')";
$db -> query($wxch_user_sql);
$ecs_user_id = $db -> insert_id();
if($ecs_user_id<=0){
exit('error get insert_id');
}
 
$url3 = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$APPID."&secret=".$SCRETID;
$re3 = curl_get_contents1($url3);
$re3arr = json_decode($re3,true);
$token = $re3arr['access_token'];
$url2 = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=".$token."&openid=".$openid."&lang=zh_CN";
$re2 = curl_get_contents1($url2);
$rearr2 = json_decode($re2,true);
 
$uc_username = $rearr2['nickname']?$rearr2['nickname']: 'doubag' . $ecs_user_id;
$time = gmtime();
$user_sql = "INSERT INTO `ecs_users` (`user_name`,`password`,`reg_time`) VALUES ('$uc_username','$passw','$time')";
$db -> query($user_sql);
$uc_update = "UPDATE ecs_weixin_user SET `uname` = '$uc_username' WHERE `uid` = '$ecs_user_id'";
$db -> query($uc_update);
$user->set_session($uc_username);
$user->set_cookie($uc_username,1);
update_user_info();
 
/*
$up_uid = get_affiliate();
if($up_uid>0){
$sql = 'UPDATE ecs_users SET parent_id = ' . $up_uid . ' WHERE user_id = ' . $ecs_user_id;
$db ->query($sql);
header('Location: user.php?newuser=1');
}*/
 
}else{
$user->set_session($user_name);
$user->set_cookie($user_name,1);
update_user_info();
 
}
 
 
//setcookie("sopenid",$openid,time()+864000,'/');
}
}
//var_dump($openid);
 
 
 
 
 
function curl_get_contents1($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_TIMEOUT, 2);
curl_setopt($ch, CURLOPT_USERAGENT, "IE 6.0");
curl_setopt($ch, CURLOPT_REFERER, "");
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$r = curl_exec($ch);
curl_close($ch);
return $r;
}

php版本微信卡卷测试代码api也是我们开发中的一个非常实用的插件了,下面我们来看看这篇php版本微信卡卷测试代码api例子,希望对各位有帮助。


创建卡卷:
public function createcard(){//新建卡卷
    $appid=C('APPID');
         $appsecret=C('SCRETID');
        $asstonek = $this->get_token($appid,$appsecret);
        $url = "https://api.weixin.qq.com/card/create?access_token=".$asstonek;
        $pjson ='{ "card": {
"card_type": "GROUPON",
"groupon": {
"base_info": {
"logo_url":
"http://mmbiz.qpic.cn/mmbiz/ibkgH5qOticpLRCYTKmibPW028nOv2YYg42UsK8MWV5fVLRUUTrNyrg3nJgxThaP9tNg1JZXHk88FdLqxmmNq4CHg/0?wx_fmt=jpeg",
"brand_name":"海底捞123",
"code_type":" CODE_TYPE_TEXT ",
"title": "132 元双人火锅套餐",
"sub_title": "",
"color": "Color010",
"notice": "使用时向服务员出示此券",
"service_phone": "020-88888888",
"description": "不可与其他优惠同享\n 如需团购券发票, 请在消费时向商户提出\n 店内均可
使用,仅限堂食\n 餐前不可打包,餐后未吃完,可打包\n 本团购券不限人数,建议 2 人使用,超过建议人
数须另收酱料费 5 元/位\n 本单谢绝自带酒水饮料",
"date_info": {
"type": 2,
"fixed_term": 30,
"fixed_begin_term": 0
},
"sku": {
"quantity": 500000
},
"get_limit": 3,
"use_custom_code": false,
"bind_openid": false,
"can_share": true,
"can_give_friend": true,
"location_id_list" : [123, 12321, 345345],
"custom_url_name": "立即使用",
"custom_url": "http://www.qq.com",
"custom_url_sub_title": "6 个汉字 tips",
"promotion_url_name": "更多优惠",
"promotion_url": "http://www.qq.com",
"source": "大众点评"
},
"deal_detail": "以下锅底 2 选 1(有菌王锅、麻辣锅、大骨锅、番茄锅、清补凉锅、酸菜鱼锅可
选):\n 大锅 1 份 12 元\n 小锅 2 份 16 元\n 以下菜品 2 选 1\n 特级肥牛 1 份 30 元\n 洞庭?鱼卷 1 份
20 元\n 其他\n 鲜菇猪肉滑 1 份 18 元\n 金针菇 1 份 16 元\n 黑木耳 1 份 9 元\n 娃娃菜 1 份 8 元\n 冬
瓜 1 份 6 元\n 火锅面 2 个 6 元\n 欢乐畅饮 2 位 12 元\n 自助酱料 2 位 10 元"}
}
}';
 
 
$re3 = $this->curlp($url,$pjson);
        $re3arr = json_decode($re3,true);
        dump($re3arr);
    
    }
卡卷领取测试:(二维码)
public function tcard(){//卡卷测试
    header ( "Content-Type: text/html; charset=UTF-8" );
    
    
        $appid=C('APPID');
         $appsecret=C('SCRETID');
        $asstonek = $this->get_token($appid,$appsecret);    
        $ticket = $this->get_card_ticket($asstonek);
        dump($asstonek);
        dump($ticket);
        
        
        /*  获取卡卷列表
        $url = "https://api.weixin.qq.com/card/batchget?access_token=".$asstonek;
        $jsondata = '{"offset":0,"count":10}';
        $re = $this->curlp($url,$jsondata);
        dump($re);
        */
        
        //  获取卡卷详情
        $url3 = "https://api.weixin.qq.com/card/get?access_token=".$asstonek;
        $getcardinfo = '{
"card_id":"pYKCus2uC2fwIf3STA-agJ_XhqfI"
}';
 
    $re3 = $this->curlp($url3,$getcardinfo);
        $re3arr = json_decode($re3,true);
        dump($re3arr);
        //  status =  CARD_STATUS_VERIFY_OK  卡卷审核通过
        //  获取卡卷详情
        
        
        $fcardjson = '{
"action_name": "QR_CARD",
"action_info": {
"card": {
"card_id": "pYKCus2uC2fwIf3STA-agJ_XhqfI",
"is_unique_code": false ,
}
}
}';
 
$url2 = "https://api.weixin.qq.com/card/qrcode/create?access_token=".$asstonek;
$re2 = $this->curlp($url2,$fcardjson);
$re2arr = json_decode($re2,true);
$ewmticket = $re2arr['ticket'];
if($re2arr['errmsg']!='ok') exit($re2arr['errmsg']);
dump($re2arr);
echo '<img src="https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket='.$ewmticket.'">';
        
        
        
    }
卡卷投放(领取):html5 js api
public function get_h5_card($data=array()){
    $appid=$this->appid;
    $appsecret=$this->appsecret;
    $asstonek = $this->get_token($appid,$appsecret);    
    $ticket = $this->get_card_ticket($asstonek);
    $data['api_ticket']=$ticket;
    $data['timestamp']=time();
    $data['signature'] = self::getSign($data); 
    //echo $ticket;
    $data2['card_id']=$data['card_id'];
    unset($data['api_ticket']);
    unset($data['card_id']);
    $data2['card_ext']=json_encode($data);
    return $data2;
    dump($data);
}  
    
 
public function tcard1(){//html5 js api 卡卷投放
        $card = new \Org\Util\Card('wx37445*******3ae8','6854f901**********4f9a3');
        $cardid = 'pYKCus4Tmp_sBh6eiqfG-hN_ySzc';
        $data['card_id']=$cardid;
        $data['code']='';
        $data['openid']='';
        $data2 = $card->get_h5_card($data);
        $this->assign('carddata',json_encode($data2));
        //dump(($data2));
        $this->siteDisplay ( 'card' );
需要完整卡卷投放接口请淘宝联系我。

微信红包有许多种形式来给各位发布了,我们有摇一摇的红包也有像本文章要介绍的裂变红包了,下面我们一起来看看小编整理的php版本微信裂变红包api
功能介绍

 

1、商户调用接口时,通过指定发送对象以及发送金额的方式发放红包,这样的方式,允许商户灵活的应用于各种各样丰富的活动场景

 

2、领取到红包后,用户的资金直接进入微信零钱,避免繁复的领奖流程,带给用户微信支付原生的流畅体验

 

 

 

微信红包发送规则

 

1. 发送频率规则

 

◆ 每分钟发送红包数量不得超过1800个;

 

◆ 北京时间0:00-8:00不触发红包赠送;(如果以上规则不满足您的需求,请发邮件至wxhongbao@tencent.com获取升级指引)

 

2. 红包规则

 

◆ 单个红包金额介于[1.00元,200.00元]之间;

 

◆ 同一个红包只能发送给一个用户;(如果以上规则不满足您的需求,请发邮件至wxhongbao@tencent.com获取升级指引)

 

 

 

裂变红包

 

发送频率规则

 

◆ 每分钟发送红包数量不得超过1800个;

 

◆ 北京时间0:00-8:00不触发红包赠送;(如果以上规则不满足您的需求,请发邮件至wxhongbao@tencent.com获取升级指引)

 

红包规则

 

◆ 单个红包金额介于[1.00元,1000.00元]之间;

 

◆ 裂变组合中的每个红包平均金额介于[1.00元,200.00元]之间;

 

◆ 同一组裂变红包只能发送给一个用户;(如果以上规则不满足您的需求,请发邮件至wxhongbao@tencent.com获取升级指引)

 

 

 


接口详细说明

 

1.红包发放说明

 

用于企业向微信用户个人发裂变红包

 

目前支持向指定微信用户的openid发放指定金额裂变红包。(获取openid参见微信公众平台开发者文档: 网页授权获取用户基本信息)

 

◆ 商户调用接口时,通过指定发送金额以及指定一位发送对象的方式发放一组红包

 

◆ 指定发送对象领取到红包后,资金直接进入微信零钱,带给用户微信支付原生的流畅体验

 

◆ 指定发送对象能够将组合中的剩余红包分享给好友,好友可继续领取,形成传播效应,放大企业品牌价值

 

2.接口调用请求说明

 












请求Url https://api.mch.weixin.qq.com/mmpaymkttransfers/sendgroupredpack
是否需要证书 是(证书及使用说明详见商户证书)
请求方式 POST

 

3.请求参数

 








































































































































字段名 字段 必填 示例值 类型 说明
随机字符串 nonce_str 5K8264ILTKCH16CQ2502SI8ZNMTM67VS String(32) 随机字符串,不长于32位
签名 sign C380BEC2BFD727A4B6845133519F3AD6 String(32) 详见签名生成算法
商户订单号 mch_billno 10000098201411111234567890 String(28) 商户订单号(每个订单号必须唯一)

组成: mch_id+yyyymmdd+10位一天内不能重复的数字。

接口根据商户订单号支持重入, 如出现超时可再调用。
商户号 mch_id 10000098 String(32) 微信支付分配的商户号
子商户号 sub_mch_id 10000090 String(32) 微信支付分配的子商户号,受理模式下必填
公众账号appid wxappid wx8888888888888888 String(32) 商户appid
商户名称 send_name 天虹百货 String(32) 红包发送者名称
用户openid re_openid oxTWIuGaIt6gTKsQRLau2M0yL16E String(32) 接收红包的种子用户(首个用户)

用户在wxappid下的openid
总金额 total_amount 1000 int 红包发放总金额,即一组红包金额总和,包括分享者的红包和裂变的红包,单位分
红包发放总人数 total_num 3 int 红包发放总人数,即总共有多少人可以领到该组红包(包括分享者)
红包金额设置 amt_type ALL_RAND String(32) 红包金额设置方式

ALL_RAND—全部随机,商户指定总金额和红包发放总人数,由微信支付随机计算出各红包金额

ALL_SPECIFIED—全部自定义

SEED_SPECIFIED—种子红包自定义,其他随机
各红包金额 amt_list 200|100|100 String(256) 各红包具体金额,自定义金额时必须设置,单位分
红包祝福语 wishing 感谢您参加猜灯谜活动,祝您元宵节快乐! String(128) 红包祝福语
活动名称 act_name 猜灯谜抢红包活动 String(32) 活动名称
备注 remark 猜越多得越多,快来抢! String(256) 备注信息
商户logo的url logo_imgurl https://wx.gtimg.com/mch/img/ico-logo.png String(128) 商户logo的url(暂未开放)
背景水印图片 watermark_imgurl https://wx.gtimg.com/mch/img/ico-logo.png String(128) 背景水印图片url
详情页banner图 banner_imgurl https://wx.gtimg.com/mch/img/ico-logo.png String(128) 红包详情页面的banner图片url

 

数据示例:

 





<xml>

<sign><![CDATA[E1EE61A91C8E90F299DE6AE075D60A2D]]></sign>

<mch_billno><![CDATA[0010010404201411170000046545]]></mch_billno>

<mch_id><![CDATA[888]]></mch_id>

<wxappid><![CDATA[wxcbda96de0b165486]]></wxappid>

<send_name><![CDATA[send_name]]></send_name>

<re_openid><![CDATA[onqOjjmM1tad-3ROpncN-yUfa6uI]]></re_openid>

<total_amount><![CDATA[200]]></total_amount>

<amt_type><![CDATA[ALL_RAND]]></amt_type>

<amt_list><![CDATA[200|100|100]]></amt_list>

<total_num><![CDATA[3]]></total_num>

<wishing><![CDATA[恭喜发财]]></wishing>

<act_name><![CDATA[新年红包]]></act_name>

<remark><![CDATA[新年红包]]></remark>

<logo_imgurl><![CDATA[https://xx/img/wxpaylogo.png]]></logo_imgurl>

<share_content><![CDATA[share_content]]></share_content>

<share_url><![CDATA[https://xx/img/wxpaylogo.png]]></share_url>

<share_imgurl><![CDATA[https:/xx/img/wxpaylogo.png]]></share_imgurl>

<watermark_imgurl><![CDATA[https:/xx/img/wxpaylogo.png]]></watermark_imgurl>

<banner_imgurl><![CDATA[https:/xx/img/wxpaylogo.png]]></banner_imgurl>

<nonce_str><![CDATA[50780e0cca98c8c8e814883e5caa672e]]></nonce_str>

</xml>

 

4.返回参数

 









































































































字段名 变量名 必填 示例值 类型 说明
返回状态码 return_code SUCCESS String(16) SUCCESS/FAIL

此字段是通信标识,非交易标识,交易是否成功需要查看result_code来判断
返回信息 return_msg 签名失败

 
String(128) 返回信息,如非空,为错误原因

签名失败

参数格式校验错误
以下字段在return_code为SUCCESS的时候有返回
签名 sign C380BEC2BFD727A4B6845133519F3AD6 String(32) 生成签名方式详见签名生成算法
业务结果 result_code SUCCESS String(16) SUCCESS/FAIL
错误代码 err_code SYSTEMERROR String(32) 错误码信息
错误代码描述 err_code_des 系统错误 String(128) 结果信息描述
以下字段在return_code 和result_code都为SUCCESS的时候有返回
商户订单号 mch_billno 10000098201411111234567890 String(28) 商户订单号(每个订单号必须唯一)

组成: mch_id+yyyymmdd+10位一天内不能重复的数字
商户号 mch_id 10000098 String(32) 微信支付分配的商户号
公众账号appid wxappid wx8888888888888888 String(32) 商户appid
用户openid re_openid oxTWIuGaIt6gTKsQRLau2M0yL16E String(32) 接收红包的种子用户(首个用户)

用户在wxappid下的openid
总付款金额 total_amount 1000 int 总付款金额,单位分
发放成功时间 send_time 20150227091010 String(14) 红包发放成功时间,格式为yyyyMMddHHmmss,如2015年02月27日9点10分10秒表示为20150227091010
微信单号 send_listid 1000000000201502270093647546 String(32) 微信红包订单号

 

成功示例:

 





<xml>

<return_code><![CDATA[SUCCESS]]></return_code>

<return_msg><![CDATA[发放成功.]]></return_msg>

<result_code><![CDATA[SUCCESS]]></result_code>

<err_code><![CDATA[0]]></err_code>

<err_code_des><![CDATA[发放成功.]]></err_code_des>

<mch_billno><![CDATA[0010010404201411170000046545]]></mch_billno>

<mch_id>10010404</mch_id>

<wxappid><![CDATA[wx6fa7e3bab7e15415]]></wxappid>

<re_openid><![CDATA[onqOjjmM1tad-3ROpncN-yUfa6uI]]></re_openid>

<total_amount>3</total_amount>

<send_time>20150227091010</send_time>

<send_listid>1000000000201502270093647546</send_listid>

</xml>

 

失败示例:

 





<xml>

<return_code><![CDATA[FAIL]]></return_code>

<return_msg><![CDATA[系统繁忙,请稍后再试.]]></return_msg>

<result_code><![CDATA[FAIL]]></result_code>

<err_code><![CDATA[268458547]]></err_code>

<err_code_des><![CDATA[系统繁忙,请稍后再试.]]></err_code_des>

<mch_billno><![CDATA[0010010404201411170000046542]]></mch_billno>

<mch_id>10010404</mch_id>

<wxappid><![CDATA[wx6fa7e3bab7e15415]]></wxappid>

<re_openid><![CDATA[onqOjjmM1tad-3ROpncN-yUfa6uI]]></re_openid>

<total_amount>3</total_amount>

</xml>

 

 

 

5.错误码

 




































































错误码

描述

解决方案

CA_ERROR

请求未携带证书,或请求携带的证书出错

到商户平台下载证书,请求带上证书后重试。

SIGN_ERROR

商户签名错误

按文档要求重新生成签名后再重试。

FREQ_LIMIT

受频率限制

请对请求做频率控制

XML_ERROR

请求的xml格式错误,或者post的数据为空

检查请求串,确认无误后重试

PARAM_ERROR

参数错误

请查看err_code_des,修改设置错误的参数

OPENID_ERROR

Openid错误

根据用户在商家公众账号上的openid,获取用户在红包公众账号上的openid 错误。请核对商户自身公众号appid和用户在此公众号下的openid。

NOTENOUGH

余额不足

商户账号余额不足,请登录微信支付商户平台充值

FATAL_ERROR

重复请求时,参数与原单不一致

使用相同商户单号进行重复请求时,参数与第一次请求时不一致,请检查并修改参数后再重试。

TIME_LIMITED

企业红包的发送时间受限

请北京时间0:00-8:00时间之外触发红包赠送

SECOND_OVER_LIMITED

企业红包的按分钟发放受限

每分钟发送红包数量不得超过1800个;(可联系微信支付wxhongbao@tencent.com调高额度)

DAY_ OVER_LIMITED

企业红包的按天日发放受限

单个商户日发送红包数量不大于10000个;(可联系微信支付wxhongbao@tencent.com调高额度)

MONEY_LIMIT

红包金额发放限制

每个红包金额必须大于1元,小于1000元(可联系微信支付wxhongbao@tencent.com调高额度至4999元)

XML_ERROR

请求的xml格式错误,或者post的数据为空

检查请求串,确认无误后重试

SEND_FAILED

红包发放失败,请更换单号再重试

原商户单号已经失败,如果还要对同一个用户发放红包, 需要更换新的商户单号再试。

SYSTEMERROR

系统繁忙,请再试。

可用同一商户单号再次调用,只会发放一个红包
自从支付宝与微信做了红包功能之后现在各种开发商活动都会有这种功能了,我下面来不讲那些第三方接口了,直接来看一个利用PHP随机生成几组不同的数据实现发红包功能的例子。


使用PHP发红包,当我们输入红包数量和总金额后,PHP会根据这两个值进行随机分配每个金额,保证每个人都能领取到一个红包,每个红包金额不等,就是要求红包金额要有差异,所有红包金额总额应该等于总金额。
查看演示 下载源码
我们先来分析下规律。
设定总金额为10元,有N个人随机领取:
N=1 第一个
则红包金额=X元;
N=2 第二个
为保证第二个红包可以正常发出,第一个红包金额=0.01至9.99之间的某个随机数。
第二个红包=10-第一个红包金额;
N=3 第三个
红包1=0.01至9.99之间的某个随机数
红包2=0.01至(10-红包1-0.01)的某个随机数
红包3=10-红包1-红包2
……

于是我们得到一个规律,在分配当前红包金额时,先预留剩余红白所需最少金额,然后在0.01至总金额-预留金额间取随机数,得到的随机数就是当前红包分配的金额。
实际应用中,程序先将红包金额分配好,即发红包时,红包个数以及每个红包的金额都分配好了,那么用户来抢红包时,我们随机给用户返回一个红包即可。

红包分配代码:
 
$total=20;//红包总金额  
$num=10;// 分成10个红包,支持10人随机领取  
$min=0.01;//每个人最少能收到0.01元  
 
for ($i=1;$i<$num;$i++)  
{  
    $safe_total=($total-($num-$i)*$min)/($num-$i);//随机安全上限  
    $money=mt_rand($min*100,$safe_total*100)/100;  
    $total=$total-$money; 
    
    echo '第'.$i.'个红包:'.$money.' 元,余额:'.$total.' 元 ';  
}  
echo '第'.$num.'个红包:'.$total.' 元,余额:0 元';  

运行以上代码,会输出以下结果:
第1个红包,金额2.08元,余额17.92元
第2个红包,金额1.81元,余额16.11元
第3个红包,金额0.15元,余额15.96元
第4个红包,金额1.61元,余额14.35元
第5个红包,金额1.11元,余额13.24元
第6个红包,金额1.51元,余额11.73元
第7个红包,金额1.21元,余额10.52元
第8个红包,金额2.58元,余额7.94元
第9个红包,金额5.4元,余额2.54元
第10个红包,金额2.54元,余额0元

[!--infotagslink--]

相关文章

  • php正确禁用eval函数与误区介绍

    eval函数在php中是一个函数并不是系统组件函数,我们在php.ini中的disable_functions是无法禁止它的,因这他不是一个php_function哦。 eval()针对php安全来说具有很...2016-11-25
  • php中eval()函数操作数组的方法

    在php中eval是一个函数并且不能直接禁用了,但eval函数又相当的危险了经常会出现一些问题了,今天我们就一起来看看eval函数对数组的操作 例子, <?php $data="array...2016-11-25
  • Python astype(np.float)函数使用方法解析

    这篇文章主要介绍了Python astype(np.float)函数使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-08
  • 图解PHP使用Zend Guard 6.0加密方法教程

    有时为了网站安全和版权问题,会对自己写的php源码进行加密,在php加密技术上最常用的是zend公司的zend guard 加密软件,现在我们来图文讲解一下。 下面就简单说说如何...2016-11-25
  • Python中的imread()函数用法说明

    这篇文章主要介绍了Python中的imread()函数用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16
  • C# 中如何取绝对值函数

    本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
  • C#学习笔记- 随机函数Random()的用法详解

    下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • ps怎么使用HSL面板

    ps软件是现在很多人都会使用到的,HSL面板在ps软件中又有着非常独特的作用。这次文章就给大家介绍下ps怎么使用HSL面板,还不知道使用方法的下面一起来看看。 &#8195;...2017-07-06
  • Plesk控制面板新手使用手册总结

    许多的朋友对于Plesk控制面板应用不是非常的了解特别是英文版的Plesk控制面板,在这里小编整理了一些关于Plesk控制面板常用的使用方案整理,具体如下。 本文基于Linu...2016-10-10
  • 金额阿拉伯数字转换为中文的自定义函数

    CREATE FUNCTION ChangeBigSmall (@ChangeMoney money) RETURNS VarChar(100) AS BEGIN Declare @String1 char(20) Declare @String2 char...2016-11-25
  • 使用insertAfter()方法在现有元素后添加一个新元素

    复制代码 代码如下: //在现有元素后添加一个新元素 function insertAfter(newElement, targetElement){ var parent = targetElement.parentNode; if (parent.lastChild == targetElement){ parent.appendChild(newEl...2014-05-31
  • Android开发中findViewById()函数用法与简化

    findViewById方法在android开发中是获取页面控件的值了,有没有发现我们一个页面控件多了会反复研究写findViewById呢,下面我们一起来看它的简化方法。 Android中Fin...2016-09-20
  • C++中 Sort函数详细解析

    这篇文章主要介绍了C++中Sort函数详细解析,sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变...2022-08-18
  • 使用GruntJS构建Web程序之构建篇

    大概有如下步骤 新建项目Bejs 新建文件package.json 新建文件Gruntfile.js 命令行执行grunt任务 一、新建项目Bejs源码放在src下,该目录有两个js文件,selector.js和ajax.js。编译后代码放在dest,这个grunt会...2014-06-07
  • 使用percona-toolkit操作MySQL的实用命令小结

    1.pt-archiver 功能介绍: 将mysql数据库中表的记录归档到另外一个表或者文件 用法介绍: pt-archiver [OPTION...] --source DSN --where WHERE 这个工具只是归档旧的数据,不会对线上数据的OLTP查询造成太大影响,你可以将...2015-11-24
  • 如何使用php脚本给html中引用的js和css路径打上版本号

    在搜索引擎中搜索关键字.htaccess 缓存,你可以搜索到很多关于设置网站文件缓存的教程,通过设置可以将css、js等不太经常更新的文件缓存在浏览器端,这样访客每次访问你的网站的时候,浏览器就可以从浏览器的缓存中获取css、...2015-11-24
  • PHP用strstr()函数阻止垃圾评论(通过判断a标记)

    strstr() 函数搜索一个字符串在另一个字符串中的第一次出现。该函数返回字符串的其余部分(从匹配点)。如果未找到所搜索的字符串,则返回 false。语法:strstr(string,search)参数string,必需。规定被搜索的字符串。 参数sea...2013-10-04
  • jQuery 1.9使用$.support替代$.browser的使用方法

    jQuery 从 1.9 版开始,移除了 $.browser 和 $.browser.version , 取而代之的是 $.support 。 在更新的 2.0 版本中,将不再支持 IE 6/7/8。 以后,如果用户需要支持 IE 6/7/8,只能使用 jQuery 1.9。 如果要全面支持 IE,并混合...2014-05-31
  • C#注释的一些使用方法浅谈

    C#注释的一些使用方法浅谈,需要的朋友可以参考一下...2020-06-25
  • PHP函数分享之curl方式取得数据、模拟登陆、POST数据

    废话不多说直接上代码复制代码 代码如下:/********************** curl 系列 ***********************///直接通过curl方式取得数据(包含POST、HEADER等)/* * $url: 如果非数组,则为http;如是数组,则为https * $header:...2014-06-07