【问题标题】:Generating 5 digit alphanumeric code with predifined characters in sequence按顺序生成具有预定义字符的 5 位字母数字代码
【发布时间】:2018-10-27 11:21:35
【问题描述】:

我想生成一个由字母数字字符组成的会员编号,删除 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 生成。

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

【问题讨论】:

  • 那么,到目前为止,您尝试了什么?
  • 字符的单个大小写,这是为了简化可以写或打印在非常小的标签上的项目的代码。想法是它们可以是易于输入表格的短代码。我想使用 aphpa 数字的原因是使用数字的 5 个字符,我们最多只能达到 99,999,其中 5 个数字中的每一个使用 33 个字符,我们可以得到 39,135,393。然后在稍后阶段,如果我们需要更多,我们可以简单地在末尾添加一个 6th,依此类推
  • 等一下,第10个id应该是0000a。你不想在0000a 之前使用00010——有几个原因。 1. 你会失去sort()-ability 和 2. 你从“一个字符”到“两个字符”然后回到“一个字符”逻辑。
  • 是的,我真的需要设置我自己的计数,而不是 0-9 它需要是 0-9 + a-z(尽管我们计划更改字符的顺序 - 但那不是现在很重要)
  • 在基数为 33 的数字中,第 34 位将是 00011。

标签: php uniqueidentifier base-conversion


【解决方案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

【讨论】:

  • 虽然我不完全理解它是如何工作的,但我非常感谢!
  • 我如何使至少 5 个字符?另外,如果我们用完了 5 位代码,我们如何使它成为 6?然后是 7 和 8 未来?
  • 使用str_pad()
  • 它已经正常工作了,我只是不明白数组部分 'i' => 'j',
  • 这个答案非常经典!一个人。 @The-WebGuy 你会接受这个,对吧?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-21
  • 1970-01-01
  • 2016-10-13
  • 1970-01-01
  • 1970-01-01
  • 2017-05-07
  • 1970-01-01
相关资源
最近更新 更多