Генерация 5-значного буквенно-цифрового кода с предварительно определенными символами в последовательности

Я хотел бы сгенерировать членский номер, состоящий из буквенно-цифровых символов, удалив i, o и l, чтобы избежать путаницы при наборе. должно выполняться на php (также используя Laravel 5.7, если это имеет значение, но я чувствую, что это вопрос php)

Если просто использовать 0-9, номер членства будет начинаться с 00001 для 1-го, а 11-й человек будет иметь 00011. Я хотел бы использовать буквенно-цифровые символы от 0-9 + a-z (удаляя указанные буквы)

0-9 (всего 10 символов), abcdefghjkmnpqrstuvwxyz (всего 23 символа) - это дает всего 33 символа в каждом цикле подсчета (0-10 + a-Z). вместо 10 (0-10)

Таким образом, первый членский номер по-прежнему будет 00001, тогда как 12-й теперь будет 0000a, 14-й 0000c и 34-й будет 0001a.

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

Надеюсь, я достаточно хорошо объяснил это.

Итак, что вы пробовали до сих пор?

Madhur Bhaiya 27.10.2018 13:22

Единый регистр для символов, он предназначен для упрощения кода, который может быть написан или напечатан на элементах на очень маленьких этикетках. Идея в том, что это могут быть короткие коды, которые легко ввести в форму. Причина, по которой я хотел бы использовать числовой aphpa, - это 5 символов с использованием чисел, мы можем подняться только до 99 999, где, используя 33 символа для каждой из 5 цифр, мы можем получить 39 135 393. Затем на более позднем этапе, если нам понадобится больше, мы можем просто добавить шестую в конце и так далее.

The-WebGuy 27.10.2018 13:32

Подождите, подождите, 10-й идентификатор должен быть 0000a. Вы бы не захотели использовать 00010 раньше 0000a - по нескольким причинам. 1. Вы потеряете способность sort() и 2. Вы перейдете от «односимвольного» к «двухсимвольному», а затем вернетесь к «односимвольной» логике.

mickmackusa 27.10.2018 13:40

Да, мне действительно нужно установить собственный счетчик, вместо 0-9 он должен быть 0-9 + a-z (хотя мы планируем изменить порядок символов, но сейчас это не важно)

The-WebGuy 27.10.2018 13:46

В числах с основанием 33 34-е будет 00011.

Rei 27.10.2018 13:49
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
5
1 030
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Предполагая, что это единственные символы, которые вы хотите использовать:

0123456789abcdefghjkmnpqrstuvwxyz

Вы можете использовать base_convert() и strtr() для перевода определенных символов результата в символы, которые вы хотите.

function mybase33($number) {
    return str_pad(strtr(base_convert($number, 10, 33), [
        'i' => 'j',
        'j' => 'k',
        'k' => 'm',
        'l' => 'n',
        'm' => 'p',
        'n' => 'q',
        'o' => 'r',
        'p' => 's',
        'q' => 't',
        'r' => 'u',
        's' => 'v',
        't' => 'w',
        'u' => 'x',
        'v' => 'y',
        'w' => 'z',
    ]), 5, '0', STR_PAD_LEFT);
}

echo "9 is ".mybase33(9)."\n";
echo "10 is ".mybase33(10)."\n";
echo "12 is ".mybase33(12)."\n";
echo "14 is ".mybase33(14)."\n";
echo "32 is ".mybase33(32)."\n";
echo "33 is ".mybase33(33)."\n";
echo "34 is ".mybase33(34)."\n";

Выход:

9 is 00009
10 is 0000a
12 is 0000c
14 is 0000e
32 is 0000z
33 is 00010
34 is 00011

https://3v4l.org/8YtaR

Объяснение

Вывод base_convert() использует эти символы:

0123456789abcdefghijklmnopqrstuvw

strtr() переводит определенные символы этого вывода в:

0123456789abcdefghjkmnpqrstuvwxyz

хотя я не совсем понимаю, как это работает, я очень ценю это!

The-WebGuy 27.10.2018 14:31

Как мне сделать это как минимум 5 символов? также, если у нас закончились 5-значные коды, как нам сделать их 6-ти? потом 7 и 8 в будущем?

The-WebGuy 27.10.2018 14:32

использовать str_pad()

mickmackusa 27.10.2018 14:32

он уже работает, я просто не понимаю часть массива 'i' => 'j',

The-WebGuy 27.10.2018 14:35

@mickmackusa Да, strtr() позаботится об этом.

Rei 27.10.2018 14:35

@ The-WebGuy Добавлено объяснение.

Rei 27.10.2018 14:46

Этот ответ мега классный! один на один. @ The-WebGuy Ты собираешься принять это, верно?

mickmackusa 27.10.2018 14:54

Другие вопросы по теме