Преобразовать целое число в буквенно-цифровую последовательность в PHP

Я работаю над сокращением URL. Я основал мой на этом https://github.com/phpmasterdotcom/BuildingYourOwnURLShortener и более или менее взял функцию для создания коротких кодов, потому что я сам не мог придумать алгоритм:

<?php   
    convertIntToShortCode($_GET["id"]); // Test codes

    function convertIntToShortCode($id) {
        $chars = "123456789bcdfghjkmnpqrstvwxyzBCDFGHJKLMNPQRSTVWXYZ";
        $id = intval($id);

        if ($id < 1) {
           echo "ERROR1";
        }

        $length = strlen($chars);
        // make sure length of available characters is at
        // least a reasonable minimum - there should be at
        // least 10 characters
        if ($length < 10) {
            echo "ERROR2";
        }

        $code = "";
        while ($id > $length - 1) {
            // determine the value of the next higher character
            // in the short code should be and prepend
            $code = $chars[fmod($id, $length)] . $code;
            // reset $id to remaining value to be converted
            $id = floor($id / $length);
        }

        // remaining value of $id is less than the length of
        // self::$chars
        $code = $chars[$id] . $code;

        echo $code;
    }
?>

Хотя это работает, некоторые из моих чисел (идентификатор базы данных) выдают странные шорткоды:

1 -> 2 2 -> 3... 10 -> c 11 -> d 12 -> e...

Есть ли какой-нибудь простой способ изменить этот код так, чтобы мои сгенерированные короткие коды были длиннее, чем один символ (по крайней мере, два или три символа для каждого короткого кода), даже для целых чисел, таких как 1, 2, 3 и т. Д.?

Также есть кто-нибудь, кто может сказать мне, как этот алгоритм выше работает для вывода коротких кодов для целых чисел?

заранее спасибо

1 ответ

Решение

То, что вы хотели бы сделать, это преобразовать это число в другое обозначение - то, которое включает в себя как буквы, так и цифры, например, основание 36, которое на самом деле является буквенно-цифровым -> az + 0-9.

Итак, что вам нужно сделать, это:

$string = base_convert ( $number , 10, 36 );

Документация:

string base_convert ( string $number , int $frombase , int $tobase );
Другие вопросы по тегам