本文实例讲述了PHP生成固定长度纯数字编码的方法。分享给大家供大家参考。具体如下:
很多时候我们需要一些固定长度的数字编码,如订单编号、卡号、用户编号等等!但是经常我们有的是存储在数据库中的有序编号,我们可以通过它直接转成一个固定长度的数字编码,然后更新到数据库中形成此记录的唯一编号。
PHP;">
array(
10,2,11,3,1,9,7,12,6,4,8,5,),5=>array(
4,13,15,10,14,6=>array(
2,16,18,17,7=>array(
18,22,19,20,21,8=>array(
11,24,25,23,9=>array(
24,27,28,26,10=>array(
32,30,31,29,11=>array(
9,32,33,34,35,12=>array(
31,37,36,38,);
return $mapBits[intval($width)];
}
/**
* 格式化给定时间戳
*
* @param integer $ts timestamp,if null use current timestamp
*
* @return string
*/
private static function _fmtTS($ts=null)
{
$ts = $ts ?: time();
return date(self::$_fmt,$ts);
}
/**
* 根据id获取一个随机唯一编码
* @param $id 编号
* @param int $prefix 前缀
* @param int $width 除前缀外长度
* @return string
*/
public static function generateNumber($id,$prefix=10,$width=8)
{
return sprintf("%s%s",$prefix,self::encode($id,$width));
}
/**
* 编码转换
*
* @param integer $id id
* @param integer $width 编号额外组成部分的显示宽度
*
* @return integer
*/
public static function encode($id,$width)
{
$maximum = intval(str_repeat(9,$width));
$superscript = intval(log($maximum) / log(2));
$r = 0;
$sign = 0x1 << $superscript;
$id |= $sign;
$mapbit = self::_getMapbit($width);
for ($x = 0; $x < $superscript; $x++) {
$v = ($id >> $x) & 0x1;
$r |= ($v << $mapbit[$x]);
}
$r += $maximum - pow(2,$superscript) + 1;
return sprintf("%0${width}s",$r);
}
/**
* 获取唯一编号
*
* @param integer $id id,mostly database primary key
* @param integer $width 编号显示宽度
* @param integer $ts timestamp
*
* @return string
*/
public static function get($id,$width,$ts=null)
{
return sprintf('%s%s',self::_fmtTS($ts),$width));
}
}
希望本文所述对大家的PHP程序设计有所帮助。