PHP生成不重複的訂單號

  • 2019 年 12 月 15 日
  • 筆記

使用場景:商城、微信支付等生成訂單號需求

方法一

比較常見的一種簡單方法

使用date()函數,獲取當前日期的數字,再配合rand()函數,生成幾位隨機數。便是一個簡單的12位訂單號了

<?php  function getOrderNum(){      $date = date('Ymd');      $rand = rand(0,9).rand(0,9).rand(0,9).rand(0,9);      return $date.$rand;  }  echo getOrderNum();

方法二

<?php  function getOrderNum(){      $date = date('Ymd');      $rand = substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))),0,12);       return $date.$rand;  }  echo getOrderNum();

uniqid()函數基於以微秒計的當前時間,生成一個唯一的 ID。當時前面的7位是不會經常變動的(應該是秒數,一秒一次)

所以我們使用substr()函數,截取字元串,從第8位到13位,接著這裡會有一個問題,得到的是數字+字母的隨機數,如果你需要的訂單號可以包含字母,這裡不需要轉換也可以。

這裡為了純數字的訂單號,所以要繼續進行處理。

使用str_split($string, 1)函數,將字元串,以一個字元的長度分割成變數。也就是一個字元一個變數。

array_map()函數是將數組遍歷執行一次函數,這裡使用的是ord函數,返回字元所在的ASCII碼,是一個數字。

所有的字元都已經轉成了數字,但是長度會波動(因為有寫ASCII碼可能是1.可能是81)

所以我們還要使用一個字元截取函數,implode(),截取0~12位的字元。合適範圍(5~12),最大12

這裡是完全隨機的字元。而且是基於時間微秒來生成的,重複的可能性非常非常低,之所以加上時間日期,是為了看起來更加統一。

20180131559751565757

20180131985210250485

方法三

function getOrderNum(){      $yCode = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J');      $orderSn = $yCode[intval(date('Y')) - 2017] . strtoupper(dechex(date('m'))) . date('d') . substr(time(), -5) . substr(microtime(), 2, 6) . sprintf('%02d', rand(0, 99));      return $orderSn;  }

Tags: