递增数字和字母的值

4

就像标题所说,我需要做这样的事情...

$i++;//we all know this.

$value = 'a';

increment($value);// i need this functionality
//output 
string [ b ]

///here are some more samples, to help you understand...

increment('b'); //output// c
increment('z'); //output// A [capital A not fussy but would be good :) ]
increment('9'); //output// a1
increment('a1'); //output// a2
increment('aa1'); //output// aa2

等等...

更新

假设我使用数字值 $id++,最终可能会得到一个巨大的数字 1310743942525;这比使用“ab34c9”占用更多的空间。我试图保存字符长度以在数据库上节省空间...


1
你能提供一个更好的地图来说明你所寻找的内容吗?a-b,然后A-Z,接着0-9,然后呢?我看到你有9到a1,但我不太理解你的模式。 - Brad
你试图实现什么目标?也许更好地理解问题,可以找到一个更简单的解决方案。 - AndrewR
3个回答

3
您尝试将其视为一个62进制数:
http://www.pgregg.com/projects/php/base_conversion/base_conversion.php 带有源代码的链接: http://www.pgregg.com/projects/php/base_conversion/base_conversion.inc.phps 将其转换为十进制,递增并将其转换回62进制 更新: 从我阅读代码的方式来看,您可以拥有如下工作流程:
$value = 'ab8Zb';
$value_base10 = base_base2dec($value, 62);
$value_base10++;
$value = base_dec2base($value_base10, 62); // should be 'ab8Zc'

需要注意的一点是,9将映射到a,而不是a1。 - H Hatfield
如果我能弄清楚该在函数属性中输入什么,或者如何使用它,它看起来很有前途 :) - Val
嗯,看起来它在第七位后就无法工作了,我会尝试一下看看第六位能得到多少个值 :) - Val
如果主要是用于数据库使用,我认为AndrewR的答案是正确的。 - H Hatfield

2
如果您只是想节省数据库空间,请考虑以下内容。
在MySQL中,您可以拥有一个类型为“UNSIGNED BIGINT”的字段。该字段的最大大小为18446744073709551615,存储空间仅为8个字节。
如果您将此数字(1.844 x 10^19)转换为62进制,则表示为“LygHa16AHYF”。您需要一个“CHAR(11)”(11个字节)或“VARCHAR(11)”(12个字节)才能存储转换后的数字。
如果您使用VARCHAR作为字段类型,小数字将占用更少的空间,但对于较大的数字,实际上需要更多的空间。对于巨大的数字来说,8个字节的空间已经非常小了。我建议直接将DB字段设置为“UNSIGNED BIGINT”,这样能省去很多麻烦。

8字节 * 10,000条记录会累加起来的,这只是ID而已,我的客户已经有5k个用户了,仅仅ID就会让这成为一个噩梦 :) - Val
如果你只需要处理5k-10k个ID(我假设它们都是连续的),那么请使用UNSIGNED SMALLINT,它只有2个字节,最大值为65535。如果你超过了这个范围,只需将数据类型更改为UNSIGNED MEDIUMINT,它有3个字节,并且可以达到16777215 - AndrewR
我知道你的意思,我也考虑过这个问题,事实上它很复杂,可能需要每天托管数百万条记录的东西。 - Val
如果这将作为数据库中任何外键使用,您希望它成为某种int类型。此外,在只有5k个用户的情况下试图节省空间有点像过早优化。如果您将以字符串格式(例如JSON)发送此数据,则转换后的值始终可以节省空间。否则,在许多情况下,int或long可能更好。 - H Hatfield
嗯,我的朋友,现在是星期五晚上 :) 希望我能在家或外出,但事实是我们并不总是制作我们编辑并尝试使其正常工作的网站 :) 我经常使用bigint和db opt,因为我每天都处理大量数据,问题很复杂,高基数值可能会拯救一天 :) - Val

0

您可以使用每个字母的ASCII代码。这只是一个简单的例子,将向您展示这个想法,当然,如果您想将“aa1”递增为“aa2”,则需要进行许多修改,但不可能是无所不能的;P 您只需要编写几个条件即可。

function increment($value) 
{
  if(strlen($value)>1)
    return false; 

  $asciiCode = ord($value); 
  return chr($asciiCode + 1); 
}

http://www.asciitable.com/ - ASCII码表 :)


它们不必是aa2,只需每次递增一个...就像数字有10个数字的基数一样,字母数字可以有36个数字的基数...如果这有意义的话。 - Val
就像我之前所说的,这个方法需要很多修改和许多条件来处理超过1个字符的$value。 - Norbert Orzechowicz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接