我有一个以10为底的数字。是否有将其转换为以62为底的数字?
例:
echo convert(12324324); // returns Yg3 (fantasy example here)
PHP base_convert()可以转换为基数36。
base_convert()
OLD :一个快速而肮脏的解决方案可以是使用如下函数:
function toChars($number) { $res = base_convert($number, 10,26); $res = strtr($res,'0123456789','qrstuvxwyz'); return $res; }
基数转换将您的数字转换为数字为0-9a-p的基数,然后使用快速的char替换摆脱其余的数字。
如您所见,该功能易于逆转。
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"; }