您可以使用下面的函數(code adapted from my personal framework):
function Base($input, $output, $number = 1, $charset = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ')
{
if (strlen($charset) >= 2)
{
$input = max(2, min(intval($input), strlen($charset)));
$output = max(2, min(intval($output), strlen($charset)));
$number = ltrim(preg_replace('~[^' . preg_quote(substr($charset, 0, max($input, $output)), '~') . ']+~', '', $number), $charset[0]);
if (strlen($number) > 0)
{
if ($input != 10)
{
$result = 0;
foreach (str_split(strrev($number)) as $key => $value)
{
$result += pow($input, $key) * intval(strpos($charset, $value));
}
$number = $result;
}
if ($output != 10)
{
$result = $charset[$number % $output];
while (($number = intval($number/$output)) > 0)
{
$result = $charset[$number % $output] . $result;
}
$number = $result;
}
return $number;
}
return $charset[0];
}
return false;
}
基本上你只需要抓住新生成的自動-incremented ID(這也可以確保你不會產生任何衝突)從表中,並將它傳遞給這個函數是這樣的:
$short_id = Base(10, 62, $auto_increment_id);
注意,第一和第二個參數定義輸入和輸出基地,分別。
此外,我已將「默認」0-9a-zA-Z
的字符集重新排序以符合您的示例。
如果您沒有混合字母表大小寫(基數36),您也可以使用base_convert()
。
我並不完全理解你在問什麼。您應該將縮短的URI視爲基數爲62的數字,然後考慮如何編寫一個將十進制數轉換爲基數62表示的函數。 –
我從來沒有聽說過基地-62。我會讀一下他們。 – Thomas
Base-62只是表示你的號碼系統有六十二個唯一的數字。你聽說過的通用系統包括十進制(base-10)和二進制(base-2)。查看MathWorld關於[base](http://mathworld.wolfram.com/Base.html)的文章和維基百科關於[radix]的文章(http://en.wikipedia.org/wiki/Radix)以獲取更多信息。 –