2

私の最新のプロジェクトでは、URLを短くする必要があります。URLをmysqlデータベースに入れます。これを解決する方法がわからないので、私は今問題にぶつかりました。基本的に、短縮された文字列は次のようになります(小文字、大文字、数字を含めたい)

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

したがって、1。URl->a。mysqlに保存されます。次回は、aがすでにmysqlデータベースにあるため、新しいURLが->bに保存されます。

そしてそれだけです。しかし、私にはわかりません。誰か助けてくれませんか?

編集:フォーマット&詳細説明。

これは、imgur.comのURL短縮サービスのようなものです。無限大までこのように続くはずです(これは必要ないと思います...)

4

1 に答える 1

2

次の関数を使用できます(私の個人的なフレームワークから適応したコード):

function Base($input, $output, $number = 1, $charset = 'abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ')
{
    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;
}

基本的には、新しく生成された自動インクリメントIDをテーブルから取得して(これにより、衝突が生成されないようにすることもできます)、次のようにこの関数に渡す必要があります。

$short_id = Base(10, 62, $auto_increment_id);

1番目と2番目の引数は、それぞれ入力ベースと出力ベースを定義することに注意してください。

0-9a-zA-Zまた、例に準拠するために、文字セットを「デフォルト」から並べ替えました。

base_convert()混合アルファベットケース(ベース36)なしで生活できる場合は、そのまま使用することもできます。

于 2011-09-20T23:29:14.850 に答える