The example in this article describes how PHP generates fixed-length pure digital encoding. Share it with everyone for your reference. The details are as follows:
Many times we need some fixed-length numeric codes, such as order number, card number, user number, etc.! But often what we have is an ordered number stored in the database, which we can directly convert into a fixed-length numeric code, and then update it to the database to form a unique number for this record.
-
- /**
- * Generate a unique number based on date or given prefix
- * User: minyifei.cn
- * Date: 15/7/7
- */
- namespace MinyifeiLibs;
- class SequenceNumber {
- /**
- * Get the specified mapbit based on the display width
- *
- * @param integer $width number display width
- *
- * @return array
- */
- private static function _getMapbit($width)
- {
- $mapBits = array(
- 4=>array(
- 10, 2, 11, 3, 0, 1, 9, 7, 12, 6, 4, 8, 5,
- ),
- 5=>array(
- 4, 3 , 13, 15, 7, 8, 6, 2, 1, 10, 5, 12, 0, 11, 14, 9,
- ),
- 6=>array(
- 2, 7, 10, 9, 16, 3, 6, 8, 0, 4, 1, 12, 11, 13, 18, 5, 15, 17, 14,
- ),
- 7=>array(
- 18, 0, 2, 22, 8, 3 , 1, 14, 17, 12, 4, 19, 11, 9, 13, 5, 6, 15, 10, 16, 20, 7, 21,
- ),
- 8=>array(
- 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,
- ) ,
- 9=>array(
- 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,
- ),
- 10=>array(
- 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,
- ),
- 11= >array(
- 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,
- ),
- 12=>array(
- 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,
- ),
- );
- return $mapBits[intval($width)];
- }
- /**
- * Format the given timestamp
- *
- * @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);
- }
- /**
- * Get a random unique code based on id
- * @param $id number
- * @param int $prefix prefix
- * @param int $width length except prefix
- * @return string
- */
- public static function generateNumber ($id,$prefix=10,$width=8)
- {
- return sprintf("%s%s", $prefix,self::encode($id, $width));
- }
- /**
- * Encoding conversion
- *
- * @param integer $id id
- * @param integer $width The display width of the additional component of the number
- *
- * @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);
- }
- /**
- * Get the unique number
- *
- * @param integer $id id, mostly database primary key
- * @param integer $width Number display width
- * @param integer $ts timestamp
- *
- * @return string
- */
- public static function get ($id, $width, $ts=null)
- {
- return sprintf('%s%s', self::_fmtTS($ts), self::encode($id, $width));
- }
- }
-
-
Copy code
I hope this article will be helpful to everyone’s PHP programming design.
|