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”占用更多的空间,我试图保存字符长度以保存在数据库中......

4

3 回答 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'
于 2011-07-15T15:34:08.900 回答
2

如果您要做的只是节省数据库空间,请考虑这一点。

在 MySQL 中,您可以拥有一个类型为 的字段UNSIGNED BIGINT。该字段的最大大小为 18446744073709551615,存储空间仅为 8 个字节。

如果将此数字 (1.844 x 10^19) 转换为 base-62,它将表示为LygHa16AHYF. 您需要一个CHAR(11)(11 个字节)或一个VARCHAR(11)(12 个字节)来存储转换后的数字。

如果您使用 VARCHAR 作为字段类型,则较小的数字会占用更少的空间,但对于较大的数字,它实际上会占用更多空间。无论如何,8 个字节对于一个巨大的数字来说是非常小的。我会省力,只需将数据库字段设置为UNSIGNED BIGINT.

于 2011-07-15T15:55:29.213 回答
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 码表 :)

于 2011-07-15T15:29:02.993 回答