あるベースから別のベースに変換するための組み込み関数base_convert()があります。アルファベットは固定されていますが、strtr()を使用して、これらの数字を独自の数字に置き換えることができます。
「tenTo31(2)の出力は2である必要があります」:1つの可能性は、「2」を再び3番目のシンボルにすることです。
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)番号を10進数に戻すには、最初に変換(strtr)を逆にしてから、base_convert(..、31、10)を呼び出す必要があります。base(31)からの変換とbase(31)への変換を1つの関数に組み合わせることができます。
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()、...の代わりに1つの柔軟な関数を使用できます。