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 相关文章推荐
PHP安全配置
Dec 06 PHP
php入门学习知识点二 PHP简单的分页过程与原理
Jul 14 PHP
PHP内核介绍及扩展开发指南―基础知识
Sep 11 PHP
php教程 插件机制在PHP中实现方案
Nov 02 PHP
PHP实现显示照片exif信息的方法
Jul 11 PHP
调试PHP程序的多种方法介绍
Nov 06 PHP
php中实现用数组妩媚地生成要执行的sql语句
Jul 10 PHP
phalcon框架使用指南
Feb 23 PHP
php curl 模拟登录并获取数据实例详解
Dec 22 PHP
PHP基于openssl实现的非对称加密操作示例
Jan 11 PHP
Laravel自定义 封装便捷返回Json数据格式的引用方法
Sep 29 PHP
深入分析PHP设计模式
Jun 15 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递归删除目录几个代码实例
2014/04/21 PHP
PHP中快速生成随机密码的几种方式
2017/04/17 PHP
网站被黑的假象--ARP欺骗之页面中加入一段js
2007/05/16 Javascript
优化javascript的执行速度
2010/01/23 Javascript
深入理解JavaScript系列(3) 全面解析Module模式
2012/01/15 Javascript
解析JavaScript中的标签语句
2013/06/19 Javascript
js跨浏览器实现将字符串转化为xml对象的方法
2013/09/25 Javascript
javascript数组详解
2014/10/22 Javascript
jquery实现Ctrl+Enter提交表单的方法
2015/07/21 Javascript
js实现浮动在网页右侧的简洁QQ在线客服代码
2015/09/04 Javascript
Google 地图API Map()构造器详解
2016/08/06 Javascript
基于jQuery实现选项卡效果
2017/01/04 Javascript
jQuery插件echarts实现的去掉X轴、Y轴和网格线效果示例【附demo源码下载】
2017/03/04 Javascript
JavaScript实现元素滚动条到达一定位置循环追加内容
2017/12/28 Javascript
vue移动端微信授权登录插件封装的实例
2018/08/28 Javascript
vue中的router-view组件的使用教程
2018/10/23 Javascript
vue地址栏直接输入路由无效问题的解决
2018/11/15 Javascript
jQuery实现侧边栏隐藏与显示的方法详解
2018/12/22 jQuery
Vue 一键清空表单的实现方法
2020/02/07 Javascript
Python BeautifulSoup中文乱码问题的2种解决方法
2014/04/22 Python
Python获取系统默认字符编码的方法
2015/06/04 Python
Python+树莓派+YOLO打造一款人工智能照相机
2018/01/02 Python
Python进阶之全面解读高级特性之切片
2019/02/19 Python
Python弹出输入框并获取输入值的实例
2019/06/18 Python
django fernet fields字段加密实践详解
2019/08/12 Python
移动Web—CSS为Retina屏幕替换更高质量的图片
2012/12/24 HTML / CSS
加拿大最大的钻石商店:Peoples Jewellers
2018/01/01 全球购物
绘画设计学生的个人自我评价
2013/09/20 职场文书
银行会计职员个人的自我评价
2013/09/29 职场文书
总经理秘书工作职责
2013/12/26 职场文书
大学生职业生涯规划方案
2014/01/03 职场文书
经理助理岗位职责
2014/03/05 职场文书
小学二年级数学教学计划
2015/01/20 职场文书
汽车修理厂管理制度
2015/08/05 职场文书
2019年世界儿童日宣传标语
2019/11/22 职场文书
《刺客之王:C罗全景传记》:时代从来不会亏待手艺人
2019/11/28 职场文书