尝试在PHP中编写通用的4位字母数字系列。
模式如下
0000
0001
....
....
9999
A000
货段:A001
型....
....
A999
B000
....
....
Z999
AA00
....
....
AA99
AB00
....
....
ZZ99
AAA0
....
....
AAA9
AAB0
....
....
兹兹
我试图根据 Z 的 no 和 9 的 no 来制作逻辑,但无法得到任何具体的东西。
我正在尝试编写一个代码,该代码将在输入系列的最后一个数字时返回该系列的下一个数字。
任何提示或线索将不胜感激
当使用PHP的内置增量运算符时,这实际上非常简单,该运算符能够处理这样的字母数字序列。
有两个边界异常需要手动处理:
- 从数字到字母数字的第一次跳跃
- 终止系列
<?php
function getNext($input){
// boundary cases
switch($input){
// bridge numeric to alphanumeric
case '9999': return 'A000';
// terminate sequence, instead of expanding to 5 digits 'AAAA0'
case 'ZZZ9': return 'ZZZA';
// start over
case 'ZZZZ': return '0000';
}
// normal increment
$input = substr(++$input,0,4);
// pad with leading zeros
return str_pad($input, 4, '0', STR_PAD_LEFT);
}
$samples = [
'0000','9999','A000','A999','Z999','AA99',
'ZZ99','AAA9','ZZZ9','ZZZA','ZZZY','ZZZZ'
];
foreach ($samples as $sample)
echo $sample . ' -> ' . getNext($sample) . PHP_EOL;
0000 -> 0001
9999 -> A000
A000 -> A001
A999 -> B000
Z999 -> AA00
AA99 -> AB00
ZZ99 -> AAA0
AAA9 -> AAB0
ZZZ9 -> ZZZA
ZZZA -> ZZZB
ZZZY -> ZZZZ
ZZZZ -> 0000
请参阅此相关答案。
你可以尝试这样的事情:
<?php
function generateNext($input) {
$numbers = (int) preg_replace('/[^0-9]/', '', $input);
$letters = preg_replace('/[^a-zA-Z]/', '', $input);
if($numbers >= 99)
{
$letters = ++$letters;
$numNumbers = 4 - strlen($letters);
if($numNumbers === 0)
{
$numbers = "";
}
else
{
$numbers = str_pad("1", $numNumbers, "0", STR_PAD_LEFT);
}
$final = $letters.$numbers;
}
else if($input == "ZZZ9")
{
$final = "ZZZZ";
}
else
{
$numbers = ++$numbers;
$numNumbers = 4 - strlen($letters);
if($numNumbers === 0)
{
$numbers = "";
$letters = ++$letters;
}
else
{
$numbers = str_pad($numbers, $numNumbers, "0", STR_PAD_LEFT);
}
$final = $letters.$numbers;
}
return $final;
}
?>