在日常的网站开发中,我们经常需要生成唯一的订单号。订单号太短,在高迸发情况下,很容易造成订单号重复事件,虽然是小概率事件。
下面我们使用 PHP 多个函数生成一个现在最常用的订单号格式:
来源:http://blog.csdn.net/leyuxinsi/article/details/47009177
$order_number = date('Ymd').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);
简单从内到外解析一下这个订单号生成过程:
1、date(“Ymd”):这个很容易理解,是在最前方拼接一个当前年月日组成的数字。2.uniqid():此函数获取一个带前缀、基于当前时间微秒数的唯一 ID。
2、substr(uniqid(), 7, 13):由于 uniqid() 函数生成的结果前面 7 位很久才会发生变化,所以有或者没有对于我们没有多少影响,所以我们截取后面经常发生变化的几位。
3、str_split(substr(uniqid(), 7, 13),1):我们将刚刚生成的字符串进行分割放到数组里面,str_split() 第二个参数是每个数组元素的长度。
4、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 值,意思就是把第二个参数生成的数组每个元素全部转换为数字,因为刚刚我们截取的字符串中含有字母,不适合订单号。
5、implode():很简单了,把刚刚那个转换成数字的数字在拼接成为一个数字。
6、由于刚刚生成的随机数可能会长短不一(原因就是,每个字符转换为 ASCII 值可能不一样,有些是 2 位,有些可能是一位),所以我们同意截取 0 -8
7、然后加上刚刚的日期数字,现在就凑成了一个等长的高大上的订单号了~