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性能测试工具xhprof的详解
Jun 03 PHP
基于PHP开发中的安全防范知识详解
Jun 06 PHP
yii框架配置默认controller和action示例
Apr 30 PHP
Mac OS下配置PHP+MySql环境
Feb 25 PHP
php通过curl模拟登陆DZ论坛
May 11 PHP
php数组比较实现查找连续数的方法
Jul 29 PHP
PHP使用new StdClass()创建空对象的方法分析
Jun 06 PHP
PHP简单实现防止SQL注入的方法
Mar 13 PHP
stripos函数知识点实例分享
Feb 11 PHP
PHP获取访问设备信息的方法示例
Feb 20 PHP
PHP实用小技巧之调用录像的方法
Dec 05 PHP
PHP标准库 (SPL)――Countable用法示例
Jun 05 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 之入门篇
2006/12/04 PHP
php生成的html meta和link标记在body标签里 顶部有个空行
2010/05/18 PHP
PHP stristr() 函数(不区分大小写的字符串查找)
2010/06/03 PHP
浅析PHP绘图技术
2013/07/03 PHP
php中并发读写文件冲突的解决方案
2013/10/25 PHP
CodeIgniter开发实现支付宝接口调用的方法示例
2016/11/14 PHP
thinkphp 框架数据库切换实现方法分析
2020/05/18 PHP
浅谈PHP之ThinkPHP框架使用详解
2020/07/21 PHP
javascript学习(二)javascript常见问题总结
2013/01/02 Javascript
JQuery获取样式中的background-color颜色值的问题
2013/08/20 Javascript
JSON传递bool类型数据的处理方式介绍
2013/09/18 Javascript
浅谈JavaScript中的作用域和闭包问题
2015/07/07 Javascript
详解JavaScript中的Unescape()和String() 函数
2015/11/09 Javascript
jQuery基于toggle实现click触发DIV的显示与隐藏问题分析
2016/06/12 Javascript
jQuery遍历json的方法(推荐)
2016/06/12 Javascript
微信小程序 wx.request(object) API详解及实例代码
2016/09/30 Javascript
基于jQuery实现表格的排序
2016/12/02 Javascript
jQuery中layer分页器的使用
2017/03/13 Javascript
微信小程序实现的一键拨号功能示例
2019/04/24 Javascript
[07:06]2018DOTA2国际邀请赛寻真——卫冕冠军Team Liquid
2018/08/10 DOTA
python遍历文件夹并删除特定格式文件的示例
2014/03/05 Python
简单讲解Python编程中namedtuple类的用法
2016/06/21 Python
Python迭代器与生成器用法实例分析
2018/07/09 Python
浅谈Pandas Series 和 Numpy array中的相同点
2019/06/28 Python
将数据集制作成VOC数据集格式的实例
2020/02/17 Python
Django 删除upload_to文件的步骤
2020/03/30 Python
接口自动化多层嵌套json数据处理代码实例
2020/11/20 Python
美国名表在线商城:Ashford(支持中文)
2019/09/24 全球购物
网吧最新创业计划书范文
2014/03/27 职场文书
淘宝客服专员岗位职责
2014/04/11 职场文书
反邪教观后感
2015/06/11 职场文书
人事任命书范本
2015/09/21 职场文书
python基础之模块的导入
2021/10/24 Python
MySQL实现配置主从复制项目实践
2022/03/31 MySQL
使用Ajax实现进度条的绘制
2022/04/07 Javascript
Java由浅入深通关抽象类与接口(下篇)
2022/04/26 Java/Android