Php 自动递增id
我想构建一个php脚本,通过将前一个id增加1,自动生成一个新id。 例如:A0009变为A0010,A9999变为B0000 我写了一个有效的,但不超过5个字符长: 例如:Z9999应该转到A00000,以此类推 有什么建议吗? 以下是我的片段:Php 自动递增id,php,Php,我想构建一个php脚本,通过将前一个id增加1,自动生成一个新id。 例如:A0009变为A0010,A9999变为B0000 我写了一个有效的,但不超过5个字符长: 例如:Z9999应该转到A00000,以此类推 有什么建议吗? 以下是我的片段: <?php function replaceChar($string2replace) { $charLength = strlen($string2replace)-1; $charAt = array(); $charAt[4] = sub
<?php
function replaceChar($string2replace)
{
$charLength = strlen($string2replace)-1;
$charAt = array();
$charAt[4] = substr($string2replace, -1);
$charAt[3] = substr($string2replace, -2,1);
$charAt[2] = substr($string2replace, -3,1);
$charAt[1] = substr($string2replace, -4,1);
$charAt[0] = substr($string2replace, 0,1);
if($charAt[4] < 9)
{
$string2replace = substr_replace($string2replace,$charAt[4]+1,$charLength);
}
else
{
$charAt[4] = 0;
$string2replace = substr_replace($string2replace,$charAt[4],$charLength);
if($charAt[3] < 9)
{
$string2replace = substr_replace($string2replace,$charAt[3]+1,$charLength- 1,1);
}
else
{
$charAt[3] = 0;
$string2replace = substr_replace($string2replace,$charAt[3],$charLength-1,1);
if($charAt[2] < 9)
{
$string2replace = substr_replace($string2replace,$charAt[2]+1,$charLength-2,1);
}
else
{
$charAt[2] = 0;
$string2replace = substr_replace($string2replace,$charAt[2],$charLength-2,1);
if($charAt[1] < 9)
{
$string2replace = substr_replace($string2replace,$charAt[1]+1,$charLength-3,1);
}
else
{
$charAt[1] = 0;
$string2replace = substr_replace($string2replace,$charAt[1],$charLength-3,1);
}
if($charAt[0] < 'z')
{
$charAt[0] ++;
$string2replace = substr_replace($string2replace,$charAt[0],$charLength-4,1);
}
else
{
$charAt[0] = 'a';
$string2replace = substr_replace($string2replace,$charAt[0],$charLength-4,1);
}
}
}
}
return $string2replace;
}
$string2begin = 'A9999';
$generatedString = replaceChar($string2begin);
echo $string2begin . "<br />" . $generatedString;
?>
您的ID编号方案似乎有些做作,其中高阶数字是
A-Z
,其余数字是0-9
。如果我正确地理解了这个模式,那么这似乎可以做到:
function incrementID($id)
{
$letter = $id[0];
$number = substr($id, 1);
$newNum = str_pad($number + 1, strlen($number), '0', STR_PAD_LEFT);
// increase number only
if (strlen($number) == strlen($newNum))
return $letter . $newNum;
// increase ID length ('Z' to 'A')
if ($letter == 'Z')
return 'A' . str_repeat('0', strlen($number) + 1);
// change letter
$newLetter = chr(ord($letter) + 1);
return $newLetter . str_repeat('0', strlen($number));
}
printf("%s\n", incrementID('A0009')); // 'A0010'
printf("%s\n", incrementID('A9999')); // 'B0000'
printf("%s\n", incrementID('Z9999')); // 'A00000'
尽管您的示例不符合这一点,但我首先假设您确实想要一个基数为36的数字(任何数字都可以是
0-9,a-Z
,其中a
是10,Z
是35)。使用base-36中的数字很容易,因为可以使用将它们转换为常用的base-10。这就是增加base-36数字所需的全部操作:
function incrementBase36($id)
{
$numVal = base_convert($id, 36, 10);
$newId = base_convert($numVal + 1, 10, 36);
return strtoupper($newId);
}
printf("%s\n", incrementBase36('A0009')); // 'A000A'
printf("%s\n", incrementBase36('A9999')); // 'A999A'
printf("%s\n", incrementBase36('Z9999')); // 'Z999A'
printf("%s\n", incrementBase36('AZZZZ')); // 'B0000'
printf("%s\n", incrementBase36('ZZZZZ')); // '100000'
您的ID编号方案似乎有些做作,其中高阶数字是
A-Z
,其余数字是0-9
。如果我正确地理解了这个模式,那么这似乎可以做到:
function incrementID($id)
{
$letter = $id[0];
$number = substr($id, 1);
$newNum = str_pad($number + 1, strlen($number), '0', STR_PAD_LEFT);
// increase number only
if (strlen($number) == strlen($newNum))
return $letter . $newNum;
// increase ID length ('Z' to 'A')
if ($letter == 'Z')
return 'A' . str_repeat('0', strlen($number) + 1);
// change letter
$newLetter = chr(ord($letter) + 1);
return $newLetter . str_repeat('0', strlen($number));
}
printf("%s\n", incrementID('A0009')); // 'A0010'
printf("%s\n", incrementID('A9999')); // 'B0000'
printf("%s\n", incrementID('Z9999')); // 'A00000'
尽管您的示例不符合这一点,但我首先假设您确实想要一个基数为36的数字(任何数字都可以是
0-9,a-Z
,其中a
是10,Z
是35)。使用base-36中的数字很容易,因为可以使用将它们转换为常用的base-10。这就是增加base-36数字所需的全部操作:
function incrementBase36($id)
{
$numVal = base_convert($id, 36, 10);
$newId = base_convert($numVal + 1, 10, 36);
return strtoupper($newId);
}
printf("%s\n", incrementBase36('A0009')); // 'A000A'
printf("%s\n", incrementBase36('A9999')); // 'A999A'
printf("%s\n", incrementBase36('Z9999')); // 'Z999A'
printf("%s\n", incrementBase36('AZZZZ')); // 'B0000'
printf("%s\n", incrementBase36('ZZZZZ')); // '100000'
您的id列是纯十六进制值吗?比A000低多少?为什么A9999+1=A999A不低?@Gustav:这显然不是“纯十六进制”,因为提到了
Z9999
。除非最近情况有所改变,Z
不是有效的十六进制数字。:-)我希望我误解了这个问题,希望他真的想要hex。系统显示为以26为基数的一位数字,其余数字以10为基数。那是一个什么样的混乱系统?!模式似乎是第一个数字总是大写字母。理论上,系统应继续执行Z99999->A,000000和Z,999999->A0000000。(添加逗号以帮助可读性。)您的id列是纯十六进制值吗?比A000低多少?为什么A9999+1=A999A不低?@Gustav:这显然不是“纯十六进制”,因为提到了Z9999
。除非最近情况有所改变,Z
不是有效的十六进制数字。:-)我希望我误解了这个问题,希望他真的想要hex。系统显示为以26为基数的一位数字,其余数字以10为基数。那是一个什么样的混乱系统?!模式似乎是第一个数字总是大写字母。理论上,系统应继续执行Z99999->A,000000和Z,999999->A0000000。(为了便于阅读,添加了逗号。)非常感谢您的回答,是的,这确实回答了我的问题。非常感谢您的回答,是的,这确实回答了我的问题