MySQL / PHP, но больше вопрос MATH (сокращающий скрипт)
Для моего последнего проекта мне нужно сократить URL-адреса, которые я затем помещаю в базу данных mysql. Теперь я столкнулся с проблемой, потому что я не знаю, как решить эту проблему. По сути, укороченные строки должны выглядеть следующим образом (я хочу включить строчные буквы, прописные буквы и цифры)
a
b
...
z
0
...
9
A
...
Z
aa
ab
ac
...
ba
Итак, 1. URl -> a. Хранится в MySQL. В следующий раз новый URL будет сохранен в -> b, потому что a уже находится в базе данных mysql.
И это все. Но я понятия не имею. Может ли кто-нибудь из вас помочь мне?
Редактировать: Форматирование и дальнейшее объяснение.
Это похоже на сервис сокращения URL-адресов imgur.com. Так должно продолжаться до бесконечности (что не нужно, я думаю...)
1 ответ
Вы можете использовать следующую функцию ( код адаптирован из моей личной структуры):
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;
}
По сути, вам просто нужно получить вновь сгенерированный автоматически увеличенный идентификатор (это также гарантирует, что вы не генерируете никаких коллизий) из таблицы и передать его этой функции следующим образом:
$short_id = Base(10, 62, $auto_increment_id);
Обратите внимание, что первый и второй аргументы определяют базы ввода и вывода соответственно.
Также я переупорядочил кодировку из "по умолчанию" 0-9a-zA-Z
соблюдать ваши примеры.
Вы также можете просто использовать base_convert()
если вы можете жить без случая смешанного алфавита (база 36).