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 相关文章推荐
html中select语句读取mysql表中内容
Oct 09 PHP
php Notice: Undefined index 错误提示解决方法
Aug 29 PHP
php 发送带附件邮件示例
Jan 23 PHP
PHP文件缓存类示例分享
Jan 30 PHP
PHP使用JSON和将json还原成数组
Feb 12 PHP
php中smarty实现多模版网站的方法
Jun 11 PHP
php中array_column函数简单实现方法
Jul 11 PHP
PHPCMS手机站伪静态设置详细教程
Feb 06 PHP
PHP实现的简单sha1加密功能示例
Aug 27 PHP
php爬取天猫和淘宝商品数据
Feb 23 PHP
PHP实现一维数组与二维数组去重功能示例
May 24 PHP
Laravel重定向,a链接跳转,控制器跳转示例
Oct 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
php max_execution_time执行时间问题
2011/07/17 PHP
PHP 文件上传限制问题
2019/09/01 PHP
简单的无缝滚动程序-仅几行代码
2007/05/08 Javascript
JavaScript读取中文cookie时的乱码问题的解决方法
2009/10/14 Javascript
JQuery Tips(4) 一些关于提高JQuery性能的Tips
2009/12/19 Javascript
Prototype源码浅析 String部分(三)之HTML字符串处理
2012/01/15 Javascript
Javascript引用指针使用介绍
2012/11/07 Javascript
js实现checkbox全选和反选示例
2014/05/01 Javascript
深入探讨javascript中的数据类型
2015/03/04 Javascript
js中不同的height, top的区别对比
2015/09/24 Javascript
AngularJS入门教程之控制器详解
2016/07/27 Javascript
JS碰撞运动实现方法详解
2016/12/15 Javascript
js记录点击某个按钮的次数-刷新次数为初始状态的实例
2017/02/15 Javascript
Angularjs为ng-click事件传递参数
2017/06/15 Javascript
解决Mac安装thrift因bison报错的问题
2018/05/17 Javascript
JS数组Object.keys()方法的使用示例
2019/06/05 Javascript
详解Vue 如何监听Array的变化
2019/06/06 Javascript
如何在Angular8.0下使用ngx-translate进行国际化配置
2019/07/24 Javascript
laypage+SpringMVC实现后端分页
2019/07/27 Javascript
Angular 多级路由实现登录页面跳转(小白教程)
2019/11/19 Javascript
JavaScript缺少insertAfter解决方案
2020/07/03 Javascript
[04:02]DOTA2上海特锦赛小组赛第二日recap精彩回顾
2016/02/28 DOTA
Python中转换角度为弧度的radians()方法
2015/05/18 Python
神经网络python源码分享
2017/12/15 Python
Python中列表与元组的乘法操作示例
2018/02/10 Python
Python实现程序判断季节的代码示例
2019/01/28 Python
Python中的 ansible 动态Inventory 脚本
2020/01/19 Python
HTML5的hidden属性兼容老浏览器的方法
2014/04/23 HTML / CSS
科颜氏印度官网:Kiehl’s印度
2021/02/20 全球购物
什么是托管函数?托管函数有什么用?
2014/06/15 面试题
食堂厨师岗位职责
2014/08/25 职场文书
个人先进事迹材料范文
2014/12/29 职场文书
导游词之河北白洋淀
2020/01/15 职场文书
看看如何用Python绘制小米新版天价logo
2021/04/20 Python
如何使用JavaScript策略模式校验表单
2021/04/29 Javascript
golang slice元素去重操作
2021/04/30 Golang