php用户自定义编号规则生成编号的函数

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PHP 中创建自定义 MySQL 函数,需要以下步骤: 1. 确认 MySQL 支持 UDF(用户定义函数)。 2. 创建一个 C 函数,该函数将作为 MySQL 的一个函数。 3. 将 C 函数编译成共享库。 4. 将共享库加载到 MySQL 中。 下面是一个简单的示例: 1. 确认 MySQL 支持 UDF。 在 MySQL 中,可以使用以下命令检查 UDF 是否可用: ``` SHOW VARIABLES LIKE 'have_dynamic_loading'; ``` 如果返回结果中 `have_dynamic_loading` 的值为 `YES`,则表示 UDF 可用。 2. 创建一个 C 函数。 下面是一个简单的 C 函数示例,它将两个整数相加并返回结果: ```c #include <mysql.h> my_bool add_int_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { if (args->arg_count != 2) { strcpy(message, "add_int requires two integer arguments"); return 1; } args->arg_type[0] = INT_RESULT; args->arg_type[1] = INT_RESULT; return 0; } long long add_int(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *length, char *is_null, char *error) { long long a = *((long long *) args->args[0]); long long b = *((long long *) args->args[1]); *is_null = 0; *length = 0; return a + b; } ``` 3. 将 C 函数编译成共享库。 使用以下命令将上面的示例编译成共享库: ``` gcc -shared -o add_int.so add_int.c -I /usr/include/mysql -fPIC ``` 其中,`-shared` 表示生成共享库,`-o` 指定输出文件名,`-I` 指定 MySQL 头文件路径,`-fPIC` 表示生成位置无关的代码。 4. 将共享库加载到 MySQL 中。 在 MySQL 中,可以使用以下命令将共享库加载到 MySQL 中: ``` CREATE FUNCTION add_int RETURNS INTEGER SONAME 'add_int.so'; ``` 其中,`add_int` 是函数名,`INTEGER` 是返回值类型,`SONAME` 指定共享库文件名。 现在,可以在 MySQL 中使用 `add_int` 函数了,例如: ``` SELECT add_int(1, 2); ``` 输出结果为 `3`。 注意:在实际使用中,需要根据具体情况修改 C 函数的实现,并根据操作系统和 MySQL 版本等因素进行编译和加载。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值