/生成一個訂單號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);
}