Уникальные коды кода в PHP

Nathan спросил: 12 мая 2018 в 03:55 в: php

По причинам, в которые я не буду входить, мне нужно создать уникальные идентификаторы с 4 символами, все начиная с A. так, например,

AAAAAAABAAAC

и так далее. Я посмотрел на функцию uniqid (), но, похоже, это создаст только числовое значение. Этот код не обязательно должен быть случайным, он может идти в последовательности, поэтому я мог бы использовать следующее для итерации.

$letters = range('A', 'Z');foreach ($letters as $one) {
  foreach ($letters as $two) {
    foreach ($letters as $three) {
      foreach ($letters as $four) {
        echo "$one$two$three$four";
      }
    }
  }
}

Теперь, как я мог сохранить состояние этого цикла в база данных, так как не все записи будут создаваться одновременно?

4 ответа

Есть решение
Barmar ответил: 12 мая 2018 в 04:15

Ваш код по существу является базовым номером 26, используя только буквы в виде цифр. Таким образом, вы можете сохранить инкрементирующий номер в базе данных, а затем преобразовать его в соответствующий код.

После преобразования в базу 26 вы смещаете все цифры: 0 становится A, 1 становится B, A становится K и т. д.

function num_to_code($num) {
    $base26 = str_split(str_pad(strtoupper(base_convert($num, 10, 26)), 4, "0", STR_PAD_LEFT));
    $result = "";
    foreach ($base26 as $char) {
        $result .= is_numeric($char) ? chr(ord('A') + $char) : chr(ord($char) + 10);
    }
    return $result;
}
ДЕМО
Nathan ответил: 12 мая 2018 в 04:10
но не будет преобразовывать базу 10 1000 = 1CC?
Barmar ответил: 12 мая 2018 в 04:11
@Nathan Вот почему он переносит все на буквы.
Sammitch ответил: 12 мая 2018 в 04:15
chr(ord($char) - 22) вы получите буквы верхнего регистра, а не строчные буквы
Barmar ответил: 12 мая 2018 в 04:15
@Sammitch Я добавил strtoupper(), чтобы исправить эту проблему.
Sammitch ответил: 12 мая 2018 в 04:18
@Barmar о, я думаю, мы просто предоставляем циклы CPU сегодня. :П
castis ответил: 12 мая 2018 в 04:05

На самом деле это не самая лучшая идея, но если у вас есть автоматический инкрементированный идентификатор в базе данных, вы всегда можете:

$autoinc = 36; // lets say its the 36th record
$alpha_id = "AAAA";
for($i=0; $i < $autoinc; $i++) {
    $alpha_id++;
}
var_dump($alpha_id); // AABK

Если они должны начинаться с A, и только 4 символа, вы получите всего около 17,5 тыс. Записей, прежде чем вы закончите.

Barmar ответил: 12 мая 2018 в 05:27
хе-хе, он сказал "прикладом": P
Sammitch ответил: 12 мая 2018 в 04:28

@ Ответ Бармара достаточно хорош, но я заметил, что я не вижу в нем math . Поэтому я выкопал какой-то старый код, который я написал для такой ситуации:

function arb_encode($num, $basestr) {
    $base = strlen($basestr);
    $rep = '';
    while($num > 0) {
        $rem = $num % $base;
        $rep = $basestr[$rem] . $rep;
        $num = ($num - $rem) / $base;
    }
    return $rep;
}function arb_decode($num, $basestr) {
    $base = strlen($basestr);
    $dec = 0;
    $num_arr = str_split((string)$num);
    $cnt = strlen($num);
    for($i=0; $i < $cnt; $i++) {
        $pos = strpos($basestr, $num_arr[$i]);
        if( $pos === false ) {
            Throw new Exception(sprintf('Unknown character %s at offset %d', $num_arr[$i], $i));
        }
        $dec = ($dec * $base) + $pos;
    }
    return $dec;
}$alpha = implode('', range('A', 'Z'));
var_dump(
    str_pad( arb_encode(1234, $alpha), 4, 'A', STR_PAD_LEFT),
    arb_decode('BUTT', $alpha)
);

Выход:

string(4) "ABVM"
int(31609)