Contents
- UNIX
- Windows
- サーバ
- プログラミング言語
- データベース
- プロトコル
- サービス
- オープンソース
- 規格・技術
- アプリケーション
- PC
- DEVICE
- その他(未分類)
お問合せ: メールフォーム
以下の表のように、0 ~ 35 を [0-9a-z] の 1byte で表現します。
base_convert()関数を使うことで、あらかじめ配列等でマッピングテーブルを定義しておく必要がなくなります。
0 | 0 | 1 | 1 | 2 | 2 | 3 | 3 | 4 | 4 | 5 | 5 |
---|---|---|---|---|---|---|---|---|---|---|---|
6 | 6 | 7 | 7 | 8 | 8 | 9 | 9 | a | 10 | b | 11 |
c | 12 | d | 13 | e | 14 | f | 15 | g | 16 | h | 17 |
i | 18 | j | 19 | k | 20 | l | 21 | m | 22 | n | 23 |
o | 24 | p | 25 | q | 26 | r | 27 | s | 28 | t | 29 |
u | 30 | v | 31 | w | 32 | x | 33 | y | 34 | z | 35 |
数値の基数を変換する
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"