You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对4位0-9a-z格式的标识符进行加减运算?

解决方案

你遇到的本质是36进制数的加减运算问题——你的标识符由0-9(10个)和a-z(26个)组成,刚好对应36个字符,4位固定长度等价于4位36进制数。我们可以通过「字符串转十进制数值→加减1→转回4位36进制字符串」的逻辑实现需求。

实现思路

  1. 字符转数值:把每个字符映射到对应的十进制值(0-9对应0-9,a-z对应10-35),按36进制的权重计算出整体十进制数值
  2. 数值运算:getNext对数值加1,getPrev对数值减1
  3. 数值转字符串:把运算后的十进制数转回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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 05:58:34