我需要一个函数来为数据库的每个输入增加“LETTER / NUMBER”。 就像AI for INT数据一样。
我需要这样做一个短链接代码,例如site.com/1gHrT
。
任何想法如何制作?
答案 0 :(得分:1)
URL缩短程序通常在base62中使用大整数。
整数通常在base10(这是十进制系统的另一个词,即[0-9]
)。还有其他常见系统,例如base2([0-1]
),base8([0-8]
)和base16([0-f]
)。
当你超过base10时,习惯上使用英文小写字母([a-z]
)。因此,base16为[0-9a-f]
(0123456789abcdef
)。如果您将基数推到数字和小写字母可以处理的范围之外,那么通常使用大写字母([A-Z]
)。因此,base62使用[0-9a-zA-Z]
。
在PHP中,base_convert()
函数可以处理从base2到base36(或[0-1]
到[0-9a-z]
)的任何内容。
如果您想要超越base36,那么您需要gmp
扩展名为can handle anything up to base62。如果您没有安装gmp
扩展程序,那么您应该可以在互联网上find a function somewhere。此外,虽然base64_encode()
函数可能听起来相关,但在这种情况下它不是。它对数据进行编码,这与更改基数(或radix)不同。
但是,您需要记住,base62在网络上可能有点脆弱。这是因为小写和大写字母都有重要意义。换句话说,如果一些聪明人或者gal喜欢小写URI,并将其转换为小写,那么URI将指向错误的位置。在这个意义上,base36更安全,但URI不会那么短(虽然不是那么多)。
现在,如果您想增加帖子中的数字,那么只需将其转换为base10,增加它,然后将其转换回来。
如果我们假设它确实在base62中,那么我们可以使用gmp
函数:
function base62_increment($number, $incrBy = 1) {
if ( ! defined('GMP_VERSION'))
throw new \Exception(__FUNCTION__.' needs the GMP extension');
$number = gmp_init($number, 62);
$number = gmp_add($number, $incrBy);
return gmp_strval($number, 62);
}
$base62 = '1gHrT';
$incremented = base62_increment($base62);
var_dump($base62, $incremented);
如果您想使用base36,或者如果您没有安装gmp
扩展程序,那么我们可以使用base_convert()
:
function base36_increment($number, $incrBy = 1) {
$number = base_convert($number, 36, 10);
$number += $incrBy;
return base_convert($number, 10, 36);
}
$base36 = 'esq2f';
$incremented = base36_increment($base36);
var_dump($base36, $incremented);
就是这样。
答案 1 :(得分:0)
也许你是在追求类似的东西?
function randLetter()
{
return chr(97 + mt_rand(0, 25));
}
来源:http://maymay.net/blog/2004/12/19/generating-random-letters-in-php/
答案 2 :(得分:0)
您可以使用给定的字符将数字转换为字符串,就像您将一个系统中的数字转换为另一个系统一样,具有以下算法
$n = 123; //your number
$chars = "abcdefghijklmnopqrstuvwxyz";
$chars = "0123456789" . strtoupper($chars) . $chars;
$b = strlen($chars);
$nums = array();
while ($n > 0) {
$nums[] = $n % $b;
$n = (int)($n / $b);
}
$nums = array_reverse($nums);
$out = "";
foreach ($nums as $num) {
$out .= $chars[$num];
}
在内部,您可以使用数字计数器,并使用此算法生成输出..
答案 3 :(得分:0)
未经测试且可能已经过优化以避免转换,但这会将数字转换为数字,但这会将连续的ints转换为字符串。
$startval = 12435;
$maxval = 12654;
for ($i = $startval; $i < maxval; $i++) {
$strINT = strval($i); // convert int to string
// intialize final string to empty
$strOutput = '';
/* Loop through each letter */
foreach (explode($strINT) as $letter) {
// add 65 to each letter and turn it into a letter
// letter A is character 65
$strOutput .= chr(intval($letter) + 65);
}
}