编码一般的 4 位字母数字系列

Coding a general 4 digit alpha-numeric series

正在尝试对 PHP 中的一般 4 位字母数字系列进行编码。

花样如下
0000
0001
....
....
9999
A000
A001
....
....
A999
B000
....
....
Z999
AA00
....
....
AA99
AB00
....
....
ZZ99
AAA0
....
....
AAA9
AAB0
....
....
ZZZZ

我试图根据 Z 的编号和 9 的编号来制定逻辑,但无法得到任何具体的进展。

我正在尝试编写一个代码,它将 return 在输入系列的最后一个数字时为我提供系列的下一个数字。

任何提示或线索将不胜感激

您可以尝试这样的操作:

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

}

?>

使用 PHP 的内置 increment operator 能够像这样处理字母数字序列时,这实际上非常容易。

有两个边界异常需要手动处理:

  1. 第一次从数字跳转到字母数字
  2. 终止系列

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

See this related answer.