非典型字母和数字增量

时间:2012-02-06 22:14:10

标签: php

我正在处理需要以下格式的唯一ID号的内容:

  

[A-Z] [A-Z0-9] [A-Z0-9] [A-Z0-9] [A-Z0-9] [A-Z0-9]

并增加为:

   AAAAAA,AAAAAB,... AAAAAZ,AAAAA0,AAAAA1,.. AAAAA9,AAAABA,AAAABB

我知道我可以用PHP增加字母,但是我怎么用这样的字母和数字呢?

特别说明,baseconvert不是一个选项,因为它必须始终正好是6个字符并逐渐适合所提到的格式。此外,baseconvert从0开始,而不是A,所以如果我从“621937810”(AAAAAA)开始,下一个跳转将在AAAAAZ之后并且在AAAAB0之后。它似乎是最快的解决方案,但它不起作用。

2 个答案:

答案 0 :(得分:2)

你可以从36到10尝试base_convert,然后从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);
?>

输出:

string(6) "ZZZZZW"
string(10) "2176782332"
float(2176782333)
string(6) "ZZZZZX"

example can be see here

除此之外,你可以做一些自定义增量,甚至可以在php手册中查看关于转换一些较大基数和值的base_convert注释。

澄清后编辑:

Taken from the php comments page

<?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";
?>

working example

至于从字符串ID递增,我建议保存整数值,增加该值并转换或写入类似的函数以转换为整数,递增,转换回来。前者可能更容易。

就强制使用相同的6字符格式而言,唯一一次出现此问题的方法是,当您根据格式传递Z99999时,是最大值。

答案 1 :(得分:1)

您基本上描述的是36-ary符号(而不是二进制,十进制或十六进制)。即最后一个字母代表(int value)mod 36,第二个但最后一个字母代表(value / 36)%36。将整数转换为从0到35的六个数字的数组。然后映射结果值,使得0 = A,25 = Z,26 = 0,依此类推。通过从int值0开始,递增它并在每次递增后将其转换为这样的字符串来实现递增。是的,你可能还可以设置一个36进制算术,这样你就不会在i和i + 1之间浪费时间,但我宁愿采用类似的蛮力方法开始。