当前位置:首页 > PHP教程 > php应用 > 列表

php生成固定长度纯数字编码的方法

发布:smiling 来源: PHP粉丝网  添加日期:2021-06-11 09:23:42 浏览: 评论:0 

这篇文章主要介绍了php生成固定长度纯数字编码的方法,涉及php字符串与数组的相关操作技巧,非常简单实用,需要的朋友可以参考下。

本文实例讲述了php生成固定长度纯数字编码的方法,分享给大家供大家参考,具体如下:

很多时候我们需要一些固定长度的数字编码,如订单编号、卡号、用户编号等等!但是经常我们有的是存储在数据库中的有序编号,我们可以通过它直接转成一个固定长度的数字编码,然后更新到数据库中形成此记录的唯一编号。

  1. <?php 
  2. /** 
  3.  * 根据日期或者是给定前缀生成唯一编号 
  4.  * User: minyifei.cn 
  5.  * Date: 15/7/7 
  6.  */ 
  7. namespace Minyifei\Libs; 
  8. class SequenceNumber { 
  9.  /** 
  10.   * 根据显示宽度获取指定的 mapbit 
  11.   * 
  12.   * @param integer $width 编号显示宽度 
  13.   * 
  14.   * @return array 
  15.   */ 
  16.  private static function _getMapbit($width
  17.  { 
  18.   $mapBits = array
  19.    4=>array
  20.     10, 2, 11, 3, 0, 1, 9, 7, 12, 6, 4, 8, 5, 
  21.    ), 
  22.    5=>array
  23.     4, 3, 13, 15, 7, 8, 6, 2, 1, 10, 5, 12, 0, 11, 14, 9, 
  24.    ), 
  25.    6=>array
  26.     2, 7, 10, 9, 16, 3, 6, 8, 0, 4, 1, 12, 11, 13, 18, 5, 15, 17, 14, 
  27.    ), 
  28.    7=>array
  29.     18, 0, 2, 22, 8, 3, 1, 14, 17, 12, 4, 19, 11, 9, 13, 5, 6, 15, 10, 16, 20, 7, 21, 
  30.    ), 
  31.    8=>array
  32.     11, 8, 4, 0, 16, 14, 22, 7, 3, 5, 13, 18, 24, 25, 23, 10, 1, 12, 6, 21, 17, 2, 15, 9, 19, 20, 
  33.    ), 
  34.    9=>array
  35.     24, 23, 27, 3, 9, 16, 25, 13, 28, 12, 0, 4, 10, 18, 11, 2, 17, 1, 21, 26, 5, 15, 7, 20, 22, 14, 19, 6, 8, 
  36.    ), 
  37.    10=>array
  38.     32, 3, 1, 28, 21, 18, 30, 7, 12, 22, 20, 13, 16, 15, 6, 17, 9, 25, 11, 8, 4, 27, 14, 31, 5, 23, 24, 29, 0, 10, 19, 26, 2, 
  39.    ), 
  40.    11=>array
  41.     9, 13, 2, 29, 11, 32, 14, 33, 24, 8, 27, 4, 22, 20, 5, 0, 21, 25, 17, 28, 34, 6, 23, 26, 30, 3, 7, 19, 16, 15, 12, 31, 1, 35, 10, 18, 
  42.    ), 
  43.    12=>array
  44.     31, 4, 16, 33, 35, 29, 17, 37, 12, 28, 32, 22, 7, 10, 14, 26, 0, 9, 8, 3, 20, 2, 13, 5, 36, 27, 23, 15, 19, 34, 38, 11, 24, 25, 30, 21, 18, 6, 1, 
  45.    ), 
  46.   ); 
  47.   return $mapBits[intval($width)]; 
  48.  } 
  49.  /** 
  50.   * 格式化给定时间戳 
  51.   * 
  52.   * @param integer $ts timestamp, if null use current timestamp 
  53.   * 
  54.   * @return string 
  55.   */ 
  56.  private static function _fmtTS($ts=null) 
  57.  { 
  58.   $ts = $ts ?: time(); 
  59.   return date(self::$_fmt$ts); 
  60.  } 
  61.  /** 
  62.   * 根据id获取一个随机唯一编码 
  63.   * @param $id 编号 
  64.   * @param int $prefix 前缀 
  65.   * @param int $width 除前缀外长度 
  66.   * @return string 
  67.   */ 
  68.  public static function generateNumber($id,$prefix=10,$width=8) 
  69.  { 
  70.   return sprintf("%s%s"$prefix,self::encode($id$width)); 
  71.  } 
  72.  /** 
  73.   * 编码转换 
  74.   * 
  75.   * @param integer $id id 
  76.   * @param integer $width 编号额外组成部分的显示宽度 
  77.   * 
  78.   * @return integer 
  79.   */ 
  80.  public static function encode($id$width
  81.  { 
  82.   $maximum = intval(str_repeat(9, $width)); 
  83.   $superscript = intval(log($maximum) / log(2)); 
  84.   $r = 0; 
  85.   $sign = 0x1 << $superscript
  86.   $id |= $sign
  87.   $mapbit = self::_getMapbit($width); 
  88.   for ($x = 0; $x < $superscript$x++) { 
  89.    $v = ($id >> $x) & 0x1; 
  90.    $r |= ($v << $mapbit[$x]); 
  91.   } 
  92.   $r += $maximum - pow(2, $superscript) + 1; 
  93.   return sprintf("%0${width}s"$r); 
  94.  } 
  95.  /** 
  96.   * 获取唯一编号 
  97.   * 
  98.   * @param integer $id id, mostly database primary key 
  99.   * @param integer $width 编号显示宽度 
  100.   * @param integer $ts timestamp 
  101.   * 
  102.   * @return string 
  103.   */ 
  104.  public static function get($id$width$ts=null) 
  105.  { 
  106.   return sprintf('%s%s', self::_fmtTS($ts), self::encode($id$width)); 
  107.  } 

希望本文所述对大家的php程序设计有所帮助。

Tags: php纯数字编码

分享到: