PHP生成唯一订单号

新方法:

新方法:

新方法:

复制代码
    /**
     * 生成唯一订单号,默认18位【随着时间的推移不停产生随机订单号】
     * 16位+ $add_num 位订单号
     */
    public function create_order_no($add_num = 2)
    {
        $rand_num = '';
        if($add_num > 0){
            $rand_num = sprintf("%0{$add_num}d", rand(0, str_repeat('9', $add_num)));
        }
        return date('ymd'). substr(time(), -5) . substr(microtime(), 2, 5) . $rand_num;
        //return (date('Ymd') . substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 10));       //该方法试过存在重复订单
    }
复制代码

 【注意:以下方法本人测算会有重复订单号,一天之内可能会有重复订单号】

下面使用PHP多个函数生成一个现在最常用的订单号格式

$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. 然后加上刚刚的日期数字,现在就凑成了一个等长的高大上的订单号了~

posted @   一个人的孤独自白  阅读(570)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示