有一个用于从一个基础转换为另一个基础的内置函数base_convert()。字母表是固定的,但您可以使用strtr()将这些数字替换为您自己的。
“tenTo31(2) 的输出应为 2”:一种可能性是再次将 '2' 设为第三个符号。
function tenTo31($num) {
static $from = "0123456789abcdefghijklmnopqrstu";
static $to = "yz23456789abcdefghjkmnpqrstuvwx";
return strtr(base_convert($num, 10, 31), $from, $to);
}
for($i=0; $i<31; $i++) {
echo $i, '=', tenTo31($i), ' | ';
if ( 9===$i%10 ) echo "\n";
}
印刷
0=y | 1=z | 2=2 | 3=3 | 4=4 | 5=5 | 6=6 | 7=7 | 8=8 | 9=9 |
10=a | 11=b | 12=c | 13=d | 14=e | 15=f | 16=g | 17=h | 18=j | 19=k |
20=m | 21=n | 22=p | 23=q | 24=r | 25=s | 26=t | 27=u | 28=v | 29=w |
30=x |
编辑:要将 base(31) 数字转换回十进制,您首先必须反转转换 (strtr),然后调用 base_convert(.., 31, 10)。您可以在单个函数中组合从和到 base(31) 的转换。
function convert_ten_31($num, $numIsDecimal) {
static $default = "0123456789abcdefghijklmnopqrstu";
static $symbols = "yz23456789abcdefghjkmnpqrstuvwx";
if ( $numIsDecimal ) {
return strtr(base_convert($num, 10, 31), $default, $symbols);
}
else {
return base_convert(strtr($num, $symbols, $default), 31, 10);
}
}
// testing
for($i=0; $i<10000; $i++) {
$x = convert_ten_31($i, true);
$x = convert_ten_31($x, false);
if ( $i!==(int)$x ) {
var_dump($i, $x);
die;
}
}
echo 'done.';
也很容易自己编写一个类似 base_convert() 的函数,它将符号作为参数,因此有一个灵活的函数来代替 tenTo30()、tenTo31()、tenTo32() 等。