依次生成具有预定字符的5位字母数字代码

时间:2018-10-27 11:21:35

标签: php alphanumeric id base-conversion

我想生成一个由字母数字字符组成的会员编号,删除i ol以免输入时造成混乱。可以在php中完成(如果很重要,也可以使用Laravel 5.7-但我觉得这是一个php问题)

如果仅使用0-9,则第一个会员的会员编号将以00001开始,而第11个人的会员编号将为00011。我想使用0-9 + a-z的字母数字字符(删除所述字母)

0-9(总共10个字符),abcdefghjkmnpqrstuvwxyz(总共23个字符)-每个计数周期(0-10 + a-Z)总共提供33个字符。而不是10(0-10)

因此,第一个会员号仍为00001,因为第12个会员号现在为0000a,第14个会员号为0000c,第34个会员号为0001a。

总而言之,我需要一种定义字符以进行计数的方法,该方法可以根据用户的ID生成。

我希望我已经解释得足够清楚了。

1 个答案:

答案 0 :(得分:5)

假设这些是您要使用的唯一字符:

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