Кодирование общего 4-значного алфавитно-цифрового ряда

Попытка закодировать обычные 4-значные буквенно-цифровые серии в PHP.

Картина выглядит следующим образом
0000
0001
….
….
9999
A000
A001
….
….
A999
B000
….
….
Z999
AA00
….
….
AA99
AB00
….
….
ZZ99
AAA0
….
….
AAA9
AAB0
….
….
ZZZZ

Я пытался сделать логику, основанную на нет Z и нет 9, но не смог получить ничего конкретного.

Я пытаюсь написать код, который вернет мне следующий номер серии при вводе последнего номера серии.

Любые намеки или выводы будут оценены

5

Решение

Это на самом деле довольно легко, если использовать встроенный PHP оператор приращения который способен обрабатывать буквенно-цифровые последовательности, как это.

Есть два граничных исключения, которые необходимо обработать вручную:

  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

Смотрите этот связанный ответ.

1

Другие решения

Вы можете попробовать что-то вроде этого:

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

}

?>
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector