php 根据自增id创建唯一编号类


Posted in PHP onApril 06, 2017

在开发过程中,我们数据表一般都使用自增数字作为id主键,而id是数字型,不容易理解。我们把id按一定格式转为编号后,很容易根据编号知道代表的是什么内容。

例如订单表id=20160111197681234,只看id我们并不知道这个id是订单表的id,而转为编号O-20160111197681234,则很容易看出是订单表的记录,然后可以根据id在订单表中搜寻。

编号创建的规则

1.唯一

使用自增id生成,保证唯一性

2.尽可能短

可使用数字求余对应字母的方式处理,创建较短的编号

算法原理

1.加自定义前缀,用于标识

2.格式使用前缀+字母+数字组成,数字只保留N位,超过的使用数字求余的方式使用字母对应

例如:

id=1

前缀=F

数字保留3位

则创建的编号为:F-A-001

代码如下:

IDCode.class.PHP

<?php
/**
 * php 根据自增id创建唯一编号类
 * Date:  2016-11-27
 * Author: fdipzone
 * Ver:   1.0
 *
 * Func
 * Public create 创建编号
 */
class IDCode{ // class start
  /**
   * 创建编号
   * @param Int  $id     自增id
   * @param Int  $num_length 数字最大位数
   * @param String $prefix   前缀
   * @return String
   */
  public static function create($id, $num_length, $prefix){
    // 基数
    $base = pow(10, $num_length);
    // 生成字母部分
    $division = (int)($id/$base);
    $word = '';
    while($division){
      $tmp = fmod($division, 26); // 只使用26个大写字母
      $tmp = chr($tmp + 65);   // 转为字母
      $word .= $tmp;
      $division = floor($division/26);
    }
    if($word==''){
      $word = chr(65);
    }
    // 生成数字部分
    $mod = $id % $base;
    $digital = str_pad($mod, $num_length, 0, STR_PAD_LEFT);
    $code = sprintf('%s-%s-%s', $prefix, $word, $digital);
    return $code;
  }
} // class end
?>

demo.php

<?php
require 'IDCode.class.php';
$test_ids = array(1,9,10,99,100,999,1000,1009,2099,3999,9999,14999,99999);
foreach($test_ids as $test_id){
  echo $test_id.' = '.IDCode::create($test_id, 3, 'F').'<br>';
}
?>

输出:

1 = F-A-001
9 = F-A-009
10 = F-A-010
99 = F-A-099
100 = F-A-100
999 = F-A-999
1000 = F-B-000
1009 = F-B-009
2099 = F-C-099
3999 = F-D-999
9999 = F-J-999
14999 = F-O-999
99999 = F-VD-999

源码下载地址:点击查看

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

PHP 相关文章推荐
Gregarius中文日期格式问题解决办法
Apr 22 PHP
php 数组的一个悲剧?
May 11 PHP
PHP中Fatal error session_start()错误解决步骤
Aug 05 PHP
PHP依赖倒置(Dependency Injection)代码实例
Oct 11 PHP
php随机生成数字字母组合的方法
Mar 18 PHP
php中smarty实现多模版网站的方法
Jun 11 PHP
学习php设计模式 php实现备忘录模式(Memento)
Dec 09 PHP
php断点续传之文件分割合并详解
Dec 13 PHP
visual studio code 调试php方法(图文详解)
Sep 15 PHP
Laravel 5.4.36中session没有保存成功问题的解决
Feb 19 PHP
微信JSSDK分享功能图文实例详解
Apr 08 PHP
TP5(thinkPHP5)框架使用ajax实现与后台数据交互的方法小结
Feb 10 PHP
php及codeigniter使用session-cookie的方法(详解)
Apr 06 #PHP
浅谈php(codeigniter)安全性注意事项
Apr 06 #PHP
详谈php ip2long 出现负数的原因及解决方法
Apr 05 #PHP
php生成0~1随机小数的方法(必看)
Apr 05 #PHP
php lcg_value与mt_rand生成0~1随机小数的效果对比分析
Apr 05 #PHP
php str_getcsv把字符串解析为数组的实现方法
Apr 05 #PHP
php 从指定数字中获取随机组合的简单方法(推荐)
Apr 05 #PHP
You might like
PHP字符转义相关函数小结(php下的转义字符串)
2007/04/12 PHP
phpMyAdmin 安装配置方法和问题解决
2009/06/08 PHP
smarty模板引擎之内建函数用法
2015/03/30 PHP
PHP实现无限分类的实现方法
2016/11/14 PHP
PHP接口类(interface)的定义、特点和应用示例
2020/05/18 PHP
WordPress 照片lightbox效果的运用几点
2009/06/22 Javascript
js判断输入是否为正整数、浮点数等数字的函数代码
2010/11/17 Javascript
JS验证逗号隔开可以是中文字母数字
2016/04/22 Javascript
jquery实现全选功能效果的实现代码
2016/05/05 Javascript
jQuery基本选择器之标签名选择器
2016/09/03 Javascript
javascript设计模式之模块模式学习笔记
2017/02/15 Javascript
快速解决brew安装特定版本flow的问题
2018/05/17 Javascript
JavaScript new对象的四个过程实例浅析
2018/07/31 Javascript
NodeJS如何实现同步的方法示例
2018/08/24 NodeJs
对vue中v-if的常见使用方法详解
2018/09/28 Javascript
使用vue-cli3新建一个项目并写好基本配置(推荐)
2019/04/24 Javascript
微信小程序实现带参数的分享功能(两种方法)
2019/05/17 Javascript
[01:38]完美世界高校联赛决赛花絮
2018/12/02 DOTA
Python实现按当前日期(年、月、日)创建多级目录的方法
2018/04/26 Python
Python后台管理员管理前台会员信息的讲解
2019/01/28 Python
python requests库爬取豆瓣电视剧数据并保存到本地详解
2019/08/10 Python
python实现抠图给证件照换背景源码
2019/08/20 Python
Python any()函数的使用方法
2019/10/28 Python
python将时分秒转换成秒的实例
2019/12/07 Python
python 删除系统中的文件(按时间,大小,扩展名)
2020/11/19 Python
使用Python爬取Json数据的示例代码
2020/12/07 Python
CSS3实现闪烁动画效果的方法
2015/02/09 HTML / CSS
解决CSS3的opacity属性带来的层叠顺序问题
2016/05/09 HTML / CSS
为什么要有struct关键字
2012/05/08 面试题
应届大学生自荐信格式
2013/09/21 职场文书
2014年秋季开学典礼主持词
2014/08/02 职场文书
三问三解心得体会
2014/09/05 职场文书
群众路线领导班子整改方案
2014/10/25 职场文书
股份转让协议书范本
2015/01/27 职场文书
Python Django模型详解
2021/10/05 Python
利用Java连接Hadoop进行编程
2022/06/28 Java/Android