如何对4位0-9a-z格式的标识符进行加减运算?
解决方案
你遇到的本质是36进制数的加减运算问题——你的标识符由0-9(10个)和a-z(26个)组成,刚好对应36个字符,4位固定长度等价于4位36进制数。我们可以通过「字符串转十进制数值→加减1→转回4位36进制字符串」的逻辑实现需求。
实现思路
- 字符转数值:把每个字符映射到对应的十进制值(0-9对应0-9,a-z对应10-35),按36进制的权重计算出整体十进制数值
- 数值运算:
getNext对数值加1,getPrev对数值减1 - 数值转字符串:把运算后的十进制数转回36进制,用前导0补全到4位,确保格式符合要求
PHP代码实现
// 定义字符与数值的映射表,索引对应数值,值对应字符 const BASE36_CHARS = '0123456789abcdefghijklmnopqrstuvwxyz'; function getNext(string $id): string { $decimal = 0; // 将4位36进制字符串转为十进制 for ($i = 0; $i < 4; $i++) { $charValue = strpos(BASE36_CHARS, $id[$i]); $decimal += $charValue * pow(36, 3 - $i); } // 加1后转回36进制,补前导零到4位 return str_pad(base_convert($decimal + 1, 10, 36), 4, '0', STR_PAD_LEFT); } function getPrev(string $id): string { $decimal = 0; // 将4位36进制字符串转为十进制 for ($i = 0; $i < 4; $i++) { $charValue = strpos(BASE36_CHARS, $id[$i]); $decimal += $charValue * pow(36, 3 - $i); } // 减1后转回36进制,补前导零到4位 return str_pad(base_convert($decimal - 1, 10, 36), 4, '0', STR_PAD_LEFT); } // 测试示例 echo getNext('iulz'); // 输出:ium0 echo getPrev('iulz'); // 输出:iuly
额外说明
- 代码自动处理边界情况:比如
getPrev('0000')会返回zzzz,getNext('zzzz')会返回0000,符合循环序列的逻辑 - 如果需要支持大写字母,可以修改
BASE36_CHARS为包含大写的字符集,并在函数开头对输入的$id做大小写转换 - 使用
base_convert内置函数比手动实现进制转换更高效,避免重复造轮子
内容的提问来源于stack exchange,提问作者DJQ
相关产品推荐
相关产品推荐

