php生成订单号函数

知兮丶青 函数 · 接口
阅读(823) 2018-01-11
php生成订单号函数
php生成订单号函数

收藏php生成订单号函数,方便日后使用。订单号生成很多种方式和方法,有按标志性规则的,有按业务划分的,有按订统一单生成器的,等等等等。但在众多方式中,离不开:安全性,唯一性。生成个:简短,支持高并发,安全唯一的,又包含业务规则的订单号,实在不容易。


一、摘录自:ShopNC 生成订单编号

/**
 * ShopNC 生成订单编号
 * @return string
 */
function snOrder() {
    $recharge_sn = date('Ymd').substr( implode(NULL,array_map('ord',str_split(substr(uniqid(),7,13),1))) , -8 , 8);
    return $recharge_sn;
}

样例:

string '2018011149985556' (length=16)

string '2018011197489748' (length=16)

解释:

//获取一个带前缀、基于当前时间微秒数的唯一ID。
var_dump(uniqid());
//string '5a5777a2f2eb8' (length=13)

//获取变化频繁的后6位
var_dump(substr(uniqid(),7,13));
//string '2f2eb8' (length=6)

//将字符串转换为数组,每段长度为1
var_dump(str_split(substr(uniqid(),7,13),1));
/*array (size=6)
  0 => string '2' (length=1)
  1 => string 'f' (length=1)
  2 => string '2' (length=1)
  3 => string 'e' (length=1)
  4 => string 'b' (length=1)
  5 => string '8' (length=1)*/

//使用array_map对数组每个值,都掉用ord()函数,返回相应字符的ASCII码值
var_dump(array_map('ord',str_split(substr(uniqid(),7,13),1)));
/*array (size=6)
  0 => int 50
  1 => int 102
  2 => int 51
  3 => int 50
  4 => int 97
  5 => int 48*/

//传入null将数组数字在拼接成为一个数字字符串
var_dump(implode(NULL,array_map('ord',str_split(substr(uniqid(),7,13),1))));
//string '5010251509748' (length=13)

//由于长度很难统一,从倒数第八位开始截取8位数
var_dump(substr(implode(NULL,array_map('ord',str_split(substr(uniqid(),7,13),1))),-8,8));
//string '51509748' (length=8)



二、摘录自:ECSHOP 得到新订单号

/**
 * ECSHOP 得到新订单号
 * @return  string
 */
function get_order_sn() {
    //选择一个随机的方案
    mt_srand((double) microtime() * 1000000);
    return date('Ymd') . str_pad(mt_rand(1, 99999), 5, '0', STR_PAD_LEFT);
}

样例:

string '2018011181845' (length=13)

string '2018011120993' (length=13)

解释:

//mt_srand() 播种 Mersenne Twister 随机数生成器
//自 PHP 4.2.0 起,不再需要用 srand() 或 mt_srand() 函数给随机数发生器播种,现已自动完成
mt_srand((double) microtime() * 1000000);

//生成1-99999的随机数
var_dump(mt_rand(1, 99999));
//string '5097' (length=4)

//不足5位的随机数,就在前面补0。STR_PAD_LEFT在左端填充
var_dump(str_pad(mt_rand(1, 99999), 5, '0', STR_PAD_LEFT));
//string '05097' (length=5)


如果日后开发过程中发现新的,再摘录接着补充进去。


原创文章,转载请注明出处:https://www.weizhixi.com/article/57.html