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脚本中include文件出错解决方法
Nov 20 PHP
php读取msn上的用户信息类
Dec 05 PHP
CI框架开发新浪微博登录接口源码完整版
May 28 PHP
彻底删除thinkphp3.1案例blog标签的方法
Dec 05 PHP
php实现根据IP地址获取其所在省市的方法
Apr 30 PHP
php实现购物车功能(上)
Jul 23 PHP
PHP编程之设置apache虚拟目录
Jul 08 PHP
微信封装的调用微信签名包的类库
Jun 08 PHP
PHP实现微信模拟登陆并给用户发送消息的方法【文字,图片,图文】
Jun 29 PHP
PHP实现的redis主从数据库状态检测功能示例
Jul 20 PHP
PHP实现登录注册之BootStrap表单功能
Sep 03 PHP
PHP获取日期对应星期、一周日期、星期开始与结束日期的方法
Jun 22 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
PHP7.0连接DB操作实例分析【基于mysqli】
2019/09/26 PHP
js parsefloat parseint 转换函数
2010/01/21 Javascript
Jquery选择子控件&quot;大于号&quot;和&quot; &quot;区别介绍及使用示例
2013/06/25 Javascript
jquery自动切换tabs选项卡的具体实现
2013/12/24 Javascript
JavaScript对IE操作的经典代码(推荐)
2014/03/10 Javascript
原生Js实现简易烟花爆炸效果的方法
2015/03/20 Javascript
jquery表单验证插件(jquery.validate.js)的3种使用方式
2015/03/28 Javascript
jQuery制作效果超棒的手风琴折叠菜单
2015/04/03 Javascript
ExtJs动态生成treepanel的Json格式
2015/07/19 Javascript
JS简单模拟触发按钮点击功能的方法
2015/11/30 Javascript
实例详解jQuery的无new构建
2016/08/02 Javascript
Javascript 闭包详解及实例代码
2016/11/30 Javascript
jQuery元素选择器实例代码
2017/02/06 Javascript
jQuery ajax请求struts action实现异步刷新
2017/04/19 jQuery
react redux入门示例
2018/04/19 Javascript
JavaScript实现浅拷贝与深拷贝的方法分析
2018/07/05 Javascript
详解webpack4之splitchunksPlugin代码包分拆
2018/12/04 Javascript
ES6 Generator函数的应用实例分析
2019/06/26 Javascript
解决layui表格内文本超出隐藏的问题
2019/09/12 Javascript
详解一些适用于Node.js的命名约定
2019/12/08 Javascript
JavaScript canvas仿代码流瀑布
2020/02/10 Javascript
javascript设计模式 ? 抽象工厂模式原理与应用实例分析
2020/04/09 Javascript
vue 如何使用递归组件
2020/10/23 Javascript
15行Python代码带你轻松理解令牌桶算法
2018/03/21 Python
pandas中的DataFrame按指定顺序输出所有列的方法
2018/04/10 Python
python中将\\uxxxx转换为Unicode字符串的方法
2018/09/06 Python
快速排序的四种python实现(推荐)
2019/04/03 Python
python3.6+django2.0+mysql搭建网站过程详解
2019/07/24 Python
解决python flask中config配置管理的问题
2019/07/26 Python
Django 自定义权限管理系统详解(通过中间件认证)
2020/03/11 Python
Python图像阈值化处理及算法比对实例解析
2020/06/19 Python
python-jwt用户认证食用教学的实现方法
2021/01/19 Python
全世界最美丽的四星和五星级酒店预订:Prestigia.com
2017/11/15 全球购物
初中生思想道德自我评价
2015/03/09 职场文书
2015年体育教师个人工作总结
2015/05/12 职场文书
nginx之内存池的实现
2022/06/28 Servers