php用户自定义编号规则生成编号的函数
php用户自定义编号规则生成编号的函数,{Y}代表4位年份,{M}代表2位月份,{D}代表2位天,{N}代表序号,$NLength代表序号长度,默认5位。
新编号是最后编号加1,如果没有最后编号就从1开始。如FS{Y}{N},能生成FS202300001;DT{Y}{M}{N} 生成DT20230400001;ST{Y}TD{N}DD,能生成ST2023TD00001DD
注:{Y}{M}{D}{N} 规则中只能用一次
/**
* intval的bigInt版
*
* @param [int || string] $value
* @return void
*/
function bigIntval($value) {
$value = trim($value);
if (ctype_digit($value)) {
return $value;
}
$value = preg_replace("/[^0-9](.*)$/", '', $value);
if (ctype_digit($value)) {
return $value;
}
return 0;
}
/**
* 前导0格式化
*
* @param [string] $catid
* @param integer $length
* @return void
*/
function fmid($catid='1',$length=5){
if(empty($catid)){
return false;
}
return str_pad($catid,$length,"0",STR_PAD_LEFT);
}
/**
* 调试输出用于代码 var_dump
*
* @param [*] $var
* @return void
*/
function gEcho($var){
if (is_bool($var)) {
var_dump($var);
} else if (is_null($var)) {
var_dump(NULL);
} else {
echo "<pre style='position:relative;z-index:1000;padding:10px;border-radius:5px;background:#F5F5F5;border:1px solid #aaa;font-size:14px;line-height:18px;opacity:0.9;'>" . print_r($var, true) . "</pre>";
}
}
/**
* 按规则生成新的编号
*
* @param [string] $oldCode 最后编号
* @param [string] $codeRule 编号规则
* @return void
*/
function generateCode($oldCode,$codeRule='{Y}CS{N}',$NLength=5){
$cur_year = date("Y");
$cur_mon = date("m");
$cur_day = date("d");
$lastID = 1;
$codeRule = strtoupper($codeRule);
if(!empty($oldCode)){ //如果老编号是空时直接生成新编号
// 按编号规则 拆分原编号 取得 原编号中 Y M D N 对应的值 正则定界码 ~或#
$regx_codeRule = '~' . str_replace(array('{Y}','{M}','{D}','{N}'),array('(?<Y>\d{4})','(?<M>\d{2})','(?<D>\d{2})','(?<N>\d{'.$NLength.'})'),$codeRule) . '~';
//gecho($regx_codeRule);
if(preg_match($regx_codeRule,$oldCode,$matches)){
gecho($matches);
$old_year = (!isset($matches['Y']) || empty($matches['Y'])) ? '0000' : $matches['Y'];
$old_mon = (!isset($matches['M']) || empty($matches['M'])) ? '00' : $matches['M'];
$old_day = (!isset($matches['D']) || empty($matches['D'])) ? '00' : $matches['D'];
$old_lastID = (!isset($matches['N']) || empty($matches['N'])) ? 0 : bigIntval($matches['N']); //强制转数字
}
//判断当时与原号是否一致
//gecho($cur_year); gecho($old_year);
$cur_year = (empty($old_year) || ( $cur_year > $old_year )) ? $cur_year : $old_year;
$cur_mon = (empty($old_mon) || ( $cur_mon != $old_mon )) ? $cur_mon : $old_mon;
$cur_day = (empty($old_day) || ( $cur_day != $old_day )) ? $cur_day : $old_day;
$lastID = (empty($old_lastID) || ( $lastID > $old_lastID )) ? $lastID : $old_lastID+1;
}
$lastID = fmid($lastID,$NLength);
//gecho(array($cur_year,$cur_mon,$cur_day,$lastID));
$retCode = str_replace(array('{Y}','{M}','{D}','{N}'),array($cur_year,$cur_mon,$cur_day,$lastID),$codeRule);
//gecho($retCode);
return $retCode;
}
gEcho(generateCode('','{Y}CS{N}',5));
gEcho(generateCode('2023CS00001','{Y}CS{N}',5));
gEcho(generateCode('','TS{Y}{M}{D}CS{N}',5));
// output:
2023CS00001
2023CS00002
TS20230412CS00001