2011-09-20 56 views
2

對於我的最新項目,我需要縮短然後我把一個MySQL數據庫的URL。 我現在遇到了一個問題,因爲我不知道如何解決這個問題。基本上,縮短字符串應該是這樣的(我想包括小寫字母,大寫字母和數字)MySQL/PHP,但更多的是數學問題(縮短腳本)

a 
b 
... 
z 
0 
... 
9 
A 
... 
Z 
aa 
ab 
ac 
... 
ba 

所以,1 URL - >一個。存儲在MySQL中。 下一次,新的url被存儲到 - > b,因爲a已經在mysql數據庫中。

就是這樣。但我沒有任何想法。可能有人能幫我嗎?

編輯:格式化&進一步說明。

它有點像imgur.com URL縮短服務。它應該繼續下去,直到無窮大(這是沒有必要的,我覺得...)

+0

我並不完全理解你在問什麼。您應該將縮短的URI視爲基數爲62的數字,然後考慮如何編寫一個將十進制數轉換爲基數62表示的函數。 –

+0

我從來沒有聽說過基地-62。我會讀一下他們。 – Thomas

+1

Base-62只是表示你的號碼系統有六十二個唯一的數字。你聽說過的通用系統包括十進制(base-10)和二進制(base-2)。查看MathWorld關於[base](http://mathworld.wolfram.com/Base.html)的文章和維基百科關於[radix]的文章(http://en.wikipedia.org/wiki/Radix)以獲取更多信息。 –

回答

2

您可以使用下面的函數(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()

+0

你是我的英雄! – Thomas

+0

@Thomas:沒問題,很樂意幫忙。 =) –