/生成一个订单号php
function getOrderNum(){数组
$ordernumber = date('Ymd').substr(implode(NULL, arraymap('ord', strsplit(substr(uniqid(), 7, 13), 1))), 0, 8); app
return $ordernumber;函数
}3d
简单从内到外解析一下这个订单号生成过程:token
date("Ymd"):这个很容易理解,是在最前方拼接一个当前年月日组成的数字md5
uniqid():此函数获取一个带前缀、基于当前时间微秒数的惟一ID。字符串
substr(uniqid(), 7, 13):因为uniqid()函数生成的结果前面7位好久才会发生变化,因此有或者没有对于咱们没有多少影响,因此咱们截取后面常常发生变化的几位。get
strsplit(substr(uniqid(), 7, 13), 1):咱们将刚刚生成的字符串进行分割放到数组里面,strsplit()第二个参数是每一个数组元素的长度。 arraymap('ord', strsplit(substr(uniqid(), 7, 13), 1))):其中arraymap()函数做用为:函数返回用户自定义函数做用后的数组,意思就是ord是函数ord(),然后面第二个参数是ord()函数的参数。能够这么理解ord(strsplit(substr(uniqid(), 7, 13), 1)))。而后ord()是干啥的,ord()函数php内置函数:返回字符串的首个字符的 ASCII 值,意思就是把第二个参数生成的数组每一个元素所有转换为数字,由于刚刚咱们截取的字符串中含有字母,不适合订单号。it
implode():很简单了,把刚刚那个转换成数字的数字在拼接成为一个数字。 因为刚刚生成的随机数可能会长短不一(缘由就是,每一个字符转换为ASCII值可能不同,有些是2位,有些多是一位),因此咱们统一截取0-8 而后加上刚刚的日期数字,如今就凑成了一个等长的高大上的订单号了~
上面的订单号一次生成1W条也会存在重复,下面这个就比较难重复的
function getOrderNum() {
$yCode = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J');
$orderSn = $yCode[intval(date('Y')) - 2011] . strtoupper(dechex(date('m'))) . date('d') . substr(time(), -5) . substr(microtime(), 2, 5) . sprintf('%02d', rand(0, 99));
return $orderSn; }
function getordernum(){
$orderSn = substr(date('Y'), -2) . strtoupper(dechex(date('m'))) . date('d') . substr(time(), -4) . substr(microtime(), 2, 5) . sprintf('%02d', rand(0, 99));
return $orderSn;
}
生成不重复的订单id
public function getOrderId($prefix = 'DD')
{
return $prefix . (strtotime(date('YmdHis', time()))) . substr(microtime(), 2, 6) . sprintf('%03d', rand(0, 999));
}
生成app的用户token
public function getToken()
{
//strtoupper转换成全大写的
$charid = strtoupper(md5(uniqid(mt_rand(), true)));
return substr($charid, 0, 8) . substr($charid, 8, 4) . substr($charid, 12, 4) . substr($charid, 16, 4) . substr($charid, 20, 12);
}