СТАРЫЙ : быстрое и грязное решение может заключаться в использовании функции, подобной этой:
function toChars($number) {
$res = base_convert($number, 10,26);
$res = strtr($res,'0123456789','qrstuvxwyz');
return $res;
}
Преобразование базы переводит ваше число в базу, где цифры 0-9a-p затем вы избавляетесь от оставшихся цифр с помощью быстрой замены символов.
Как вы можете заметить, функция легко обратима.
function toNum($number) {
$res = strtr($number,'qrstuvxwyz','0123456789');
$res = base_convert($number, 26,10);
return $res;
}
Кстати, что бы вы использовалиэта функция для?
Редактировать:
На основе изменения вопроса и ответа @jnpcl, здесь представлен набор функций, которые выполняют базовое преобразованиебез использования pow и log (выполнение тестов занимает половину времени).
Функции работают только для целочисленных значений.
function toBase($num, $b=62) {
$base='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$r = $num % $b ;
$res = $base[$r];
$q = floor($num/$b);
while ($q) {
$r = $q % $b;
$q =floor($q/$b);
$res = $base[$r].$res;
}
return $res;
}
function to10( $num, $b=62) {
$base='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$limit = strlen($num);
$res=strpos($base,$num[0]);
for($i=1;$i<$limit;$i++) {
$res = $b * $res + strpos($base,$num[$i]);
}
return $res;
}
Тест:
for ($i = 0; $i<1000000; $i++) {
$x = toBase($i);
$y = to10($x);
if ($i-$y)
echo "\n$i -> $x -> $y";
}