PHP заказал уникальный идентификатор - PullRequest
0 голосов
/ 08 июля 2011

Здравствуйте, я надеюсь, что кто-то может помочь мне, потому что я немного запутался в задаче, которую я должен сделать в PHP Мне нужен php-файл с уникальным идентификатором регистрации с этими параметрами: Первый - AA00001, а следующий - DF00002.

Итак, первая буква + 3 и вторая + 5, но цифры идут в +1 порядке.

Может ли кто-нибудь дать мне подсказку, как этого добиться? Спасибо!

Ответы [ 4 ]

1 голос
/ 08 июля 2011

В псевдокоде:

get previous ID
separate first letter, second letter and number
convert first letter to number, add 3, modulo 26, convert back to letter
convert second letter to number, add 5, modulo 26, convert back to letter
add 1 to number, add zero-padding to reach 5 digits
concatenate them all together
set this as the new "previous ID"

Обратите внимание, что вам нужно убедиться, что это происходит атомарно - то есть у вас нет нескольких процессов, работающих с одним и тем же идентификатором, иначе они получили бы одинаковые«следующий» ID.ИМХО это будет самая сложная часть.

0 голосов
/ 08 июля 2011

Сначала вы должны проанализировать последний регистр ID (используя substr). Затем сохраните каждое значение в переменной, соответствующей месту $first , $second, $numberpart.затем

$first = ($first  + 3 ) % 16;
$second =($first  + 5 ) % 16;
$number = $number + 1;

Затем обновите запись, соответственно преобразовав $first, $second в их соответствие.буквы.

0 голосов
/ 08 июля 2011
$lastid = 'AA00001';

$first = substr($lastid, 0, 1);
$second = substr($lastid, 1, 1);
$numeric = substr($lastid, 2);

$next_first = chr(((ord($first) - ord('A') + 3) % 26) + ord('A'));
$next_second = chr(((ord($second) - ord('A') + 5) % 26) + ord('A'));
$next_numeric = sprintf('%05d', intval($numeric) + 1);

$new_id = $next_first . $next_second . $next_numeric;

// DF00002
0 голосов
/ 08 июля 2011

Вы можете использовать substr для разделения идентификатора, dechex и hexdec для преобразования в / из десятичного в шестнадцатеричное, что дает вам часть A + 3 = D, и вы можете использовать str_pad для переднего края целого числа с нулями, что дает ты вторая часть, а потом просто конкатенируешь их.

ETA: Примерно так:

$id = 'AA00001';

$first = dechex((hexdec(substr($id,0,1))+3)%16);
$secnd = dechex((hexdec(substr($id,1,1))+5)%16);
$int = str_pad(substr($id,2)+1,5,"0",STR_PAD_LEFT);

$newid = strtoupper($first.$secnd.$int);

ETA2: Если вы не хотели идти AA00001, DF00002, GK00003, JP00004, MU00005, PZ00006, SE00007 и т. Д., В этом случае вам нужно

$first = chr(((ord(substr($id,0,1))-62)%26)+65);
$secnd = chr(((ord(substr($id,1,1))-60)%26)+65);
...