php - 按顺序生成带有预定义字符的 5 位字母数字代码
问题描述
我想生成一个由字母数字字符组成的会员编号,在键入时消除i
o
并l
避免混淆。在 php 中完成(如果重要,也使用 Laravel 5.7 - 但我觉得这是一个 php 问题)
如果仅使用 0-9,则第一个会员编号将从 00001 开始,第 11 个会员编号为 00011。我想使用 0-9 + az 的字母数字字符(删除上述字母)
0-9(共 10 个字符),abcdefghjkmnpqrstuvwxyz(共 23 个字符) - 这在每个计数周期 (0-10+aZ) 中总共有 33 个字符。而不仅仅是 10 (0-10)
所以第一个会员编号仍然是 00001,而第 12 个现在是 0000a,第 14 个是 0000c,第 34 个是 0001a。
总而言之,我需要一种方法来定义用于计数的字符,这种方法可以根据用户的 id 生成。
我希望我已经解释得足够好。
解决方案
假设这些是您要使用的唯一字符:
0123456789abcdefghjkmnpqrstuvwxyz
您可以使用base_convert()
andstrtr()
将结果的特定字符转换为您想要的字符。
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
解释
的输出base_convert()
使用这些字符:
0123456789abcdefghijklmnopqrstuvw
将该strtr()
输出的特定字符转换为:
0123456789abcdefghjkmnpqrstuvwxyz
推荐阅读
- javascript - 如何在我的网站中创建这个复杂的动画,并使其具有响应性?
- matlab - 将函数句柄传递给 Matlab 中的其他函数时,如何保留函数句柄的参数数量?
- r - 如果选项卡是从服务器端呈现的,Shinydashboard 书签不会为活动选项卡添加书签
- node.js - 填充对象数组中的键
- c# - 如何在 C# 中实现 IInternetSecurityManager.ProcessUrlAction 和 URLPOLICY_QUERY?
- reactjs - 如何映射数组,并使用 react-hooks 更改状态异步
- reactjs - React 组件在 typescript 中引用自己的 DOM 元素
- mysql - 除了向导将 xls 表导入 mysql Workbench 之外,还有其他方法吗?
- c# - 如何提供“对象”并将其传递给视图模型库?
- c# - Autofac 中的装饰器和属性注入