PHP生成唯一订单号
2016-03-15 00:00
866 查看
在日常的网站开发中,我们经常需要生成唯一的订单号。订单号太短,在高迸发情况下,很容易造成订单号重复事件,虽然是小概率事件。
下面我们使用PHP多个函数生成一个现在最常用的订单号格式:
$order_number = date('Ymd').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);
加了毫秒,变成25位了,重复几率更小
$order_number = date('YmdHi'). substr(microtime(), 2, 5) .substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);
简单从内到外解析一下这个订单号生成过程:
date("Ymd"):这个很容易理解,是在最前方拼接一个当前年月日组成的数字
uniqid():此函数获取一个带前缀、基于当前时间微秒数的唯一ID。
substr(uniqid(), 7, 13):由于uniqid()函数生成的结果前面7位很久才会发生变化,所以有或者没有对于我们没有多少影响,所以我们截取后面经常发生变化的几位。
str_split(substr(uniqid(), 7, 13), 1):我们将刚刚生成的字符串进行分割放到数组里面,str_split()第二个参数是每个数组元素的长度。
array_map('ord', str_split(substr(uniqid(), 7, 13), 1))):其中array_map()函数作用为:函数返回用户自定义函数作用后的数组,意思就是ord是函数ord(),而后面第二个参数是ord()函数的参数。可以这么理解ord(str_split(substr(uniqid(), 7, 13), 1)))。然后ord()是干啥的,ord()函数php内置函数:返回字符串的首个字符的 ASCII 值,意思就是把第二个参数生成的数组每个元素全部转换为数字,因为刚刚我们截取的字符串中含有字母,不适合订单号。
implode():很简单了,把刚刚那个转换成数字的数字在拼接成为一个数字。
由于刚刚生成的随机数可能会长短不一(原因就是,每个字符转换为ASCII值可能不一样,有些是2位,有些可能是一位),所以我们同意截取0-8
然后加上刚刚的日期数字,现在就凑成了一个等长的高大上的订单号了~
转载:http://blog.sina.com.cn/s/blog_68793f6a0102vw09.html
转载:http://www.thinksaas.cn/group/topic/352944/
下面我们使用PHP多个函数生成一个现在最常用的订单号格式:
$order_number = date('Ymd').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);
加了毫秒,变成25位了,重复几率更小
$order_number = date('YmdHi'). substr(microtime(), 2, 5) .substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);
简单从内到外解析一下这个订单号生成过程:
date("Ymd"):这个很容易理解,是在最前方拼接一个当前年月日组成的数字
uniqid():此函数获取一个带前缀、基于当前时间微秒数的唯一ID。
substr(uniqid(), 7, 13):由于uniqid()函数生成的结果前面7位很久才会发生变化,所以有或者没有对于我们没有多少影响,所以我们截取后面经常发生变化的几位。
str_split(substr(uniqid(), 7, 13), 1):我们将刚刚生成的字符串进行分割放到数组里面,str_split()第二个参数是每个数组元素的长度。
array_map('ord', str_split(substr(uniqid(), 7, 13), 1))):其中array_map()函数作用为:函数返回用户自定义函数作用后的数组,意思就是ord是函数ord(),而后面第二个参数是ord()函数的参数。可以这么理解ord(str_split(substr(uniqid(), 7, 13), 1)))。然后ord()是干啥的,ord()函数php内置函数:返回字符串的首个字符的 ASCII 值,意思就是把第二个参数生成的数组每个元素全部转换为数字,因为刚刚我们截取的字符串中含有字母,不适合订单号。
implode():很简单了,把刚刚那个转换成数字的数字在拼接成为一个数字。
由于刚刚生成的随机数可能会长短不一(原因就是,每个字符转换为ASCII值可能不一样,有些是2位,有些可能是一位),所以我们同意截取0-8
然后加上刚刚的日期数字,现在就凑成了一个等长的高大上的订单号了~
转载:http://blog.sina.com.cn/s/blog_68793f6a0102vw09.html
return date('Ymd') . str_pad(mt_rand(1, 99999), 5, '0', STR_PAD_LEFT);
return date('Ymd').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);
//生成24位唯一订单号码,格式:YYYY-MMDD-HHII-SS-NNNN,NNNN-CC,其中:YYYY=年份,MM=月份,DD=日期,HH=24格式小时,II=分,SS=秒,NNNNNNNN=随机数,CC=检查码 @date_default_timezone_set("PRC"); while(true){ //订购日期 $order_date = date('Y-m-d'); //订单号码主体(YYYYMMDDHHIISSNNNNNNNN) $order_id_main = date('YmdHis') . rand(10000000,99999999); //订单号码主体长度 $order_id_len = strlen($order_id_main); $order_id_sum = 0; for($i=0; $i<$order_id_len; $i++){ $order_id_sum += (int)(substr($order_id_main,$i,1)); } //唯一订单号码(YYYYMMDDHHIISSNNNNNNNNCC) $order_id = $order_id_main . str_pad((100 - $order_id_sum % 100) % 100,2,'0',STR_PAD_LEFT);
转载:http://www.thinksaas.cn/group/topic/352944/
相关文章推荐
- php环境搭建问题记录
- php ssh2扩展操作类
- thinkphp的execute语句
- thinkphp的select方法的缺陷
- php提高编程效率小技巧
- php删除文件夹下的所有文件
- MVC中outputcache页面缓存
- Yii2.0 rules验证规则大全
- Yii2.0 实现三级联动 [ 2.0 版本 ]
- Yii2.0高级框架数据库增删改查的一些操作
- FTP学习
- PHP 中的命名空间
- Laravel5.0学习--02 实例进阶
- Editplus最佳配色方案
- 更新matplotlib时遇到permission denied问题
- php 类文件
- php 发送邮件代码
- ThinkPHP总结(一)
- php 处理字段与数据库字段顺序不一致的 csv 文件
- HDU_ACM_A+B for Input-Output Practice (I)