在平常的網站開發中,咱們常常須要生成惟一的訂單號。訂單號過短,在高迸發狀況下,很容易形成訂單號重複事件,雖然是小几率事件。php
下面咱們使用PHP多個函數生成一個如今最經常使用的訂單號格式:html
$order_number = date('Ymd').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);java
加了毫秒,變成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"):這個很容易理解,是在最前方拼接一個當前年月日組成的數字spa
uniqid():此函數獲取一個帶前綴、基於當前時間微秒數的惟一ID。code
substr(uniqid(), 7, 13):因爲uniqid()函數生成的結果前面7位好久纔會發生變化,因此有或者沒有對於咱們沒有多少影響,因此咱們截取後面常常發生變化的幾位。htm
str_split(substr(uniqid(), 7, 13), 1):咱們將剛剛生成的字符串進行分割放到數組裏面,str_split()第二個參數是每一個數組元素的長度。blog
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/