Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/239.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 非典型字母和数字递增_Php - Fatal编程技术网

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开始,因此如果我从

我正在做一些需要唯一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开始,因此如果我从“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";
?>