Php 非典型字母和数字递增
我正在做一些需要唯一ID号的工作,其格式为: [A-Z][A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9] 和增量为: AAAAA,AAAAA B。。。AAAAZ,AAAA0,AAAA1。。aaaa9,AAAABA,AAAABB 我知道我可以在PHP中增加字母,但我如何以这种方式处理字母和数字呢Php 非典型字母和数字递增,php,Php,我正在做一些需要唯一ID号的工作,其格式为: [A-Z][A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9] 和增量为: AAAAA,AAAAA B。。。AAAAZ,AAAA0,AAAA1。。aaaa9,AAAABA,AAAABB 我知道我可以在PHP中增加字母,但我如何以这种方式处理字母和数字呢 特别注意,baseconvert不是一个选项,因为它必须始终精确地为6个字符,并以增量方式符合指定的格式。此外,baseconvert从0开始,而不是从A开始,因此如果我从
特别注意,baseconvert不是一个选项,因为它必须始终精确地为6个字符,并以增量方式符合指定的格式。此外,baseconvert从0开始,而不是从A开始,因此如果我从“621937810”(AAAAAA)开始,下一次跳转将在aaaaz之后,然后转到AAAAB0。这似乎是最快的解决方案,但它不起作用。您基本上描述的是36进制表示法(与二进制、十进制或十六进制相对)。即,最后一个字母表示(int值)mod 36,第二个但最后一个字母表示(value/36)%36。将整数转换为一个由0到35的六个数字组成的数组。然后映射结果值,使0=A、25=Z、26=0,依此类推。递增只需从int值0开始,递增,并在每次递增后将其转换为这样的字符串即可实现。是的,您可能还可以设置一个36进制的算术,这样您就不会在i和i+1之间浪费时间,但我更愿意从这样的蛮力方法开始。您基本上描述的是36进制表示法(与二进制、十进制或十六进制相反)。即,最后一个字母表示(int值)mod 36,第二个但最后一个字母表示(value/36)%36。将整数转换为一个由0到35的六个数字组成的数组。然后映射结果值,使0=A、25=Z、26=0,依此类推。递增只需从int值0开始,递增,并在每次递增后将其转换为这样的字符串即可实现。是的,你也可以设置一个36进制的算术,这样你就不会在i和i+1之间浪费时间,但我更愿意从这样的蛮力方法开始。你可以尝试从36到10,然后从10增加到36。我对像
ZZZZZW+1
这样的较大数字没有任何问题,但是正如php手册中所说的,由于浮点/双精度,较大的数字可能会出现问题
<?php
echo "<pre>";
//orig string
$test = 'ZZZZZW';
//convert from base36 to number.
$test = base_convert($test, 36, 10);
var_dump($test);
//increment
$test++;
var_dump($test);
//convert back (and upper case)
$test = strtoupper(base_convert($test, 10, 36));
var_dump($test);
?>
除此之外,您还可以进行一些自定义增量操作,甚至可以查看php手册中关于转换一些较大的基和值的注释
澄清后编辑:
:
至于从字符串ID递增,我建议要么保存整数值,increment that并转换,要么编写类似的函数转换为integer,increment,convert back。前者可能更容易
至于强制使用相同的6字符格式,唯一的问题是当您通过Z99999时,根据您的格式,它是最大值。您可以尝试从36到10,然后增加10到36。我对像ZZZZZW+1
这样的较大数字没有任何问题,但是正如php手册中所说的,由于浮点/双精度,较大的数字可能会出现问题
<?php
echo "<pre>";
//orig string
$test = 'ZZZZZW';
//convert from base36 to number.
$test = base_convert($test, 36, 10);
var_dump($test);
//increment
$test++;
var_dump($test);
//convert back (and upper case)
$test = strtoupper(base_convert($test, 10, 36));
var_dump($test);
?>
除此之外,您还可以进行一些自定义增量操作,甚至可以查看php手册中关于转换一些较大的基和值的注释
澄清后编辑:
:
至于从字符串ID递增,我建议要么保存整数值,increment that并转换,要么编写类似的函数转换为integer,increment,convert back。前者可能更容易
至于强制使用相同的6个字符格式,唯一的问题是当您通过Z99999时,根据您的格式,它是最大值。我已经考虑过了,但它必须始终精确地为6个字符,并以增量方式符合指定的格式。此外,baseconvert从0开始,而不是从A开始,因此如果我从“621937810”(AAAAA)开始,下一次跳转将在AAAZ之后,然后转到AAAB0。实际上,这是我的第一个考虑。@OksanaMolotova那么你基本上是在重塑自己的基础。您必须执行某种自定义增量。“基本转换注释”页面上有几个选项,允许您传入转换字符的数组/字符串。这将允许您使用自己的自定义基进行转换。示例:您可以将数组更改为数字之前有字母…等等。至于精确到6个字符,使用左键将0字符(A)强制放在左边。你可能还是最好先替换字母和数字(将A映射到0等),然后调用base_convert,然后恢复替换,而不是自己实际计算这些内容。我考虑过,但它必须始终精确到6个字符,并以增量方式符合指定的格式。此外,baseconvert从0开始,而不是从A开始,因此如果我从“621937810”(AAAAA)开始,下一次跳转将在AAAZ之后,然后转到AAAB0。实际上,这是我的第一个考虑。@OksanaMolotova那么你基本上是在重塑自己的基础。您必须执行某种自定义增量。“基本转换注释”页面上有几个选项,允许您传入转换字符的数组/字符串。这将允许您使用自己的自定义基进行转换。示例:您可以将数组更改为数字之前有字母…等等。至于精确到6个字符,使用左键盘将0字符(A)强制放在左边。替换字母和数字(将A映射到0等),然后调用base_convert,然后恢复替换,可能比自己实际计算这些内容更好。
<?php
function intToAlphaBaseN($n,$baseArray) {
$l=count($baseArray);
$s = '';
for ($i = 1; $n >= 0 && $i < 10; $i++) {
$s = $baseArray[($n % pow($l, $i) / pow($l, $i - 1))].$s;
$n -= pow($l, $i);
}
return $s;
}
$base=array_merge(range('A','Z'), range(0,9));
$zero = $base[0];
//an integer number
$r=rand(0, 999999);
echo "$r converts to :".str_pad(intToAlphaBaseN($r,$base), 6, $zero, STR_PAD_LEFT)."\n";
//an integer number
$r++;
echo "$r converts to :".str_pad(intToAlphaBaseN($r,$base), 6, $zero, STR_PAD_LEFT)."\n";
//an integer number
$r++;
echo "$r converts to :".str_pad(intToAlphaBaseN($r,$base), 6, $zero, STR_PAD_LEFT)."\n";
?>