̃Gg[͂ĂȃubN}[Nɒlj

PHP :: base_convert()関数で 0 ~ 35 を 1byte で表現してみる



以下の表のように、0 ~ 35 を [0-9a-z] の 1byte で表現します。
base_convert()関数を使うことで、あらかじめ配列等でマッピングテーブルを定義しておく必要がなくなります。

0 01 12 23 34 45 5
6 67 78 89 9a 10b 11
c 12d 13e 14f 15g 16h 17
i 18j 19k 20l 21m 22n 23
o 24p 25q 26r 27s 28t 29
u 30v 31w 32x 33y 34z 35


base_convert

数値の基数を変換する

string base_convert ( string number, int frombase, int tobase )

number を基数 tobase で表した文字列を返します。number の基数は、frombase で指定します。
frombase および tobase は、ともに 2 から 36 までである必要があります。
10 より大きな基数を有する数の各桁は、文字 a-z で表されます。
この場合、a は 10、b は 11、z は 35 を意味します。

number
変換する数値。

frombase
返還前の number の基数。(2 ~ 36)

tobase
変換後の number の基数。(2 ~ 36)

返り値
number を基数 tobase で表した値。


以下サンプル

<?php
 
$num = 0;
$num = base_convert($num, 36, 10);
var_dump($num);
$num = base_convert($num, 10, 36);
var_dump($num);
 
$num = 5;
$num = base_convert($num, 36, 10);
var_dump($num);
$num = base_convert($num, 10, 36);
var_dump($num);
 
 
$num = 'a';
$num = base_convert($num, 36, 10);
var_dump($num);
$num = base_convert($num, 10, 36);
var_dump($num);
 
$num = 'm';
$num = base_convert($num, 36, 10);
var_dump($num);
$num = base_convert($num, 10, 36);
var_dump($num);
 
$num = 'z';
$num = base_convert($num, 36, 10);
var_dump($num);
$num = base_convert($num, 10, 36);
var_dump($num);
 
?>

 ↓結果

string(1) "0"
string(1) "0"

string(1) "5"
string(1) "5"

string(2) "10"
string(1) "a"

string(2) "22"
string(1) "m"

string(2) "35"
string(1) "z"


使いどころ

使いどころとしては、例えば 下記のように 日付を 2byte で表現したりできる。

01/10 → 1a
05/09 → 59
11/30 → bu

サンプルコード

<?php
 
function encDate($v)
{
    list($mm, $dd) = explode('/', $v);
    $mm = base_convert($mm, 10, 36);
    $dd = base_convert($dd, 10, 36);
    return $mm.$dd;
}
function decDate($v)
{
    $mm = substr($v, 0, 1);
    $dd = substr($v, -1);
    $mm = sprintf('%02d', base_convert($mm, 36, 10));
    $dd = sprintf('%02d', base_convert($dd, 36, 10));
    return $mm.'/'.$dd;
}
 
// 1月10日
$mmdd = '01/10';
$enc = encDate($mmdd);
var_dump($enc);
$dec = decDate($enc);
var_dump($dec);
 
// 5月9日
$mmdd = '05/09';
$enc = encDate($mmdd);
var_dump($enc);
$dec = decDate($enc);
var_dump($dec);
 
// 11月30日
$mmdd = '11/30';
$enc = encDate($mmdd);
var_dump($enc);
$dec = decDate($enc);
var_dump($dec);
 
?>

 ↓結果

string(2) "1a"
string(5) "01/10"

string(2) "59"
string(5) "05/09"

string(2) "bu"
string(5) "11/30"





programming/php/etc/base_convert.txt