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 相关文章推荐
Zend Studio for Eclipse的java.lang.NullPointerException错误的解决方法
Dec 06 PHP
PHP错误WARNING: SESSION_START() [FUNCTION.SESSION-START]解决方法
May 04 PHP
php提取字符串中网站url地址的方法
Dec 03 PHP
php+xml编程之SimpleXML的应用实例
Jan 24 PHP
php使用ffmpeg获取视频信息并截图的实现方法
May 03 PHP
PHP下 Mongodb 连接远程数据库的实例代码
Aug 30 PHP
php获取ajax的headers方法与内容实例
Dec 27 PHP
LaravelS通过Swoole加速Laravel/Lumen详解
Mar 02 PHP
详细解读php的命名空间(一)
Feb 21 PHP
PHP的mysqli_thread_id()函数讲解
Jan 24 PHP
PHP钩子实现方法解析
May 21 PHP
YII2框架中actions的作用与使用方法示例
Mar 13 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
使用Limit参数优化MySQL查询的方法
2008/11/12 PHP
web目录下不应该存在多余的程序(安全考虑)
2012/05/09 PHP
thinkphp5 加载静态资源路径与常量的方法
2017/12/24 PHP
laravel 框架实现无限级分类的方法示例
2019/10/31 PHP
不错的新闻标题颜色效果
2006/12/10 Javascript
JS 文件本身编码转换 图文教程
2009/10/12 Javascript
查看图片(前进后退)功能实现js代码
2013/04/24 Javascript
extjs中form与grid交互数据(record)的方法
2013/08/29 Javascript
使用AmplifyJS组件配合JavaScript进行编程的指南
2015/07/28 Javascript
JQUERY表单暂存功能插件分享
2016/02/23 Javascript
详解微信小程序入门五: wxml文件引用、模版、生命周期
2017/01/20 Javascript
JS实现图片旋转动画效果封装与使用示例
2018/07/09 Javascript
Nuxt.js SSR与权限验证的实现
2018/11/21 Javascript
如何基于filter实现网站整体变灰功能
2020/04/17 Javascript
解决Vue中使用keepAlive不缓存问题
2020/08/04 Javascript
[01:21]辉夜杯战队访谈宣传片—CDEC
2015/12/25 DOTA
详解Python使用simplejson模块解析JSON的方法
2016/03/24 Python
django在接受post请求时显示403forbidden实例解析
2018/01/25 Python
python和flask中返回JSON数据的方法
2018/03/26 Python
python中count函数简单的实例讲解
2020/02/06 Python
M1芯片安装python3.9.1的实现
2021/02/02 Python
css3+伪元素实现鼠标移入时下划线向两边展开的效果
2017/04/25 HTML / CSS
HTML5之SVG 2D入门3—文本与图像及渲染文本介绍
2013/01/30 HTML / CSS
HTML5本地存储localStorage、sessionStorage基本用法、遍历操作、异常处理等
2014/05/08 HTML / CSS
施华洛世奇德国官网:SWAROVSKI德国
2017/02/01 全球购物
售后主管岗位职责
2013/12/08 职场文书
竞选班长演讲稿
2013/12/30 职场文书
中药学自荐信
2014/06/15 职场文书
医药公司采购员岗位职责
2014/09/12 职场文书
华清池导游词
2015/02/02 职场文书
项目合作意向书
2015/05/08 职场文书
安全教育片观后感
2015/06/17 职场文书
2019年浪漫婚礼证婚词
2019/06/27 职场文书
Matplotlib绘制混淆矩阵的实现
2021/05/27 Python
总结Pyinstaller打包的高级用法
2021/06/28 Python
解决MultipartFile.transferTo(dest) 报FileNotFoundExcep的问题
2021/07/01 Java/Android