我在这个问题上坚持了很长一段时间.我必须使用长度始终为4个字符且由0-9a-z组成的标识符.一个例子是iulz.因此,范围应该是这样的:

0000 0001 0002 ... 0009 000a 000b ... 000z 0010 ... zzzz

在我的例子中,iulz,我知道前面的ID是iuly,后面的是ium0.但我似乎想不出如何计算这一数字.如果函数hexdecdechex包含整个字母表,那么它们会对我有所帮助.

我的第一个try 是用一些for循环制作一个逻辑列表,但这需要大量的内存.我正在寻找一种方法来实现以下两个功能:

function getNext(string $id) : string { ... }
function getPrev(string $id) : string { ... }
$this->getNext('iulz') // returns 'ium0'
$this->getPrev('iulz') // returns 'iuly'

有人能让我走上正轨吗?太棒了!

推荐答案

您的编码方案包含36个符号(数字从09,字母从az),因此一种可能的方法是使用Base36实现数学运算.PHP支持base_convert()函数在任意基数之间转换数字.

<?php

function getNext($id) {
    $n = base_convert($id, 36, 10);
    $n = $n + 1;
    $n = base_convert($n, 10, 36);
    $n = str_pad($n, 4, '0', STR_PAD_LEFT);
    return $n;
}

function getPrev($id) {
    $n = base_convert($id, 36, 10);
    $n = $n - 1;
    $n = base_convert($n, 10, 36);
    $n = str_pad($n, 4, '0', STR_PAD_LEFT);
    return $n;
}

$id = 'iulz';
echo "ID: " . $id . ", next ID: " . getNext($id) . ", previous ID: " . getPrev($id) . ".";

?>

结果:

ID: iulz, next ID: ium0, previous ID: iuly.

另请注意,如果$id超出[0000 .. zzzz]范围,则需要定义函数的预期行为.

Php相关问答推荐

带有打印和回声的PHP意外命令

无法添加ProxyClass__setInitialized()上的忽略

FatFreeFramework上的不同路由

保存PHP条带以备将来使用,不显示用户界面

PHP中的圆生成器在国际日期变更线上失败

如何将WooCommerce产品属性术语名称显示为链接术语?

在Laravel中为表添加前缀,以将它们逻辑地分组

带Redhat php curl的http_code 0

设置WordPress最近的帖子小部件按修改日期排序

如何在微软图形API中使用用户S访问令牌或基于租户ID的访问令牌?

Laravel Carbon DiffForHumans选项(年,月,天)

强制客户在注册时 Select WooCommerce角色

$this->;db->;update();CodIgnitor中的功能不工作

显示自定义 Laravel 9 公共属性的错误

WooCommerce 以编程方式添加的费用不会持续存在

根据所选付款方式启用/禁用 WooCommerce 所需的 checkout 字段

提交仅包含活动详细信息选项卡表单的主表单

PHP - 计算非数值数组

在WooCommerce可变产品中显示所选变体的自定义字段

如何使用 WhatsApp Cloud API 向 WhatsApp 发送消息,而无需在发送消息之前注册收件人号码?