【PHP8.x】base_convert関数の使い方

base_convert関数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

base_convert関数は、ある基数で表現された数値を、別の基数で表現された数値に変換する関数です。2進数や16進数など様々な基数表記を、日常的な10進数と相互に変換する際に役立ちます。この関数は、プログラミングにおける基数変換を手軽に行えます。

この関数は三つの引数を取ります。一つ目は変換したい数値を文字列として、二つ目は元の基数(2から36の範囲)、三つ目は変換先の基数(2から36の範囲)を指定します。例えば、10進数の「255」を16進数に変換する際に利用します。

変換結果は文字列として返されます。Webサイトの色コードやデータ変換など、様々な場面で活用できます。ただし、この関数は整数値の基数変換を主な目的としており、浮動小数点数や負の数には直接対応していませんので、ご利用の際はご注意ください。

構文(syntax)

1<?php
2
3base_convert(string $num, int $from_base, int $to_base): string;

引数(parameters)

string $num, int $from_base, int $to_base

  • string $num: 変換したい数値を表す文字列
  • int $from_base: $num の現在の基数(2から36までの整数)
  • int $to_base: 変換後の基数(2から36までの整数)

戻り値(return)

string

指定された基数で数値が変換された結果を文字列として返します。

サンプルコード

PHPで10進数を62進数へ変換する

1<?php
2
3/**
4 * 10進数の数値を62進数の文字列に変換します。
5 *
6 * PHPの組み込み関数 `base_convert()` は、変換可能な基数 (base) が
7 * 2から36の範囲に制限されています。そのため、URL短縮などで利用される
8 * 62進数(0-9, a-z, A-Z)への変換は `base_convert()` では直接行えません。
9 *
10 * このサンプルコードは、`base_convert()` の代替として、
11 * 10進数から62進数への変換を行うカスタム関数を提供します。
12 *
13 * @param int $decimalNumber 変換する非負の10進整数
14 * @return string 62進数に変換された文字列
15 */
16function convertDecimalToBase62(int $decimalNumber): string
17{
18    // 62進数で使用する文字セットを定義します (0-9, a-z, A-Z)。
19    $characterSet = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
20    $base = strlen($characterSet); // 基数は62
21    $base62String = '';
22
23    // 引数が0の場合は、'0'を返します。
24    if ($decimalNumber === 0) {
25        return '0';
26    }
27
28    $num = $decimalNumber;
29
30    // 10進数の数値を62で割り続け、その余りから対応する文字を特定します。
31    while ($num > 0) {
32        // 余りを計算し、文字セットから対応する文字を取得します。
33        $remainder = $num % $base;
34        $base62String = $characterSet[$remainder] . $base62String;
35
36        // 次の計算のために、商を整数値で求めます。
37        $num = (int)floor($num / $base);
38    }
39
40    return $base62String;
41}
42
43// ---- 関数の使用例 ----
44
45// データベースのIDなどを想定した10進数の数値
46$id = 1_234_567_890;
47
48// 10進数を62進数に変換します。
49$shortCode = convertDecimalToBase62($id);
50
51// 結果を出力します。
52echo "10進数の {$id} は、62進数では '{$shortCode}' です。" . PHP_EOL;
53
54// 比較: base_convert() で扱える最大の36進数に変換した場合
55$base36Code = base_convert((string)$id, 10, 36);
56echo "10進数の {$id} は、36進数では '{$base36Code}' です。" . PHP_EOL;
57
58?>

PHPのbase_convert関数は、ある基数(N進数)の数値を別の基数(M進数)の数値に変換するために使用される組み込み関数です。引数$numには変換したい数値を文字列として、$from_baseには変換元の基数を、$to_baseには変換先の基数を整数で指定します。戻り値は変換された数値を文字列として返しますが、この関数が対応する基数は2から36までの範囲に制限されています。そのため、URL短縮などで利用される62進数(0-9, a-z, A-Z)のような、より大きな基数への変換は直接行えません。

このサンプルコードは、base_convertの制限を補い、10進数を62進数の文字列に変換するためのカスタム関数convertDecimalToBase62を提供しています。この関数は、引数$decimalNumberとして変換したい非負の10進整数を受け取り、62進数に変換された文字列を戻り値として返します。関数内部では、62種類の文字(0-9, a-z, A-Z)を定義し、与えられた10進数を62で割り続け、その都度発生する余りに対応する文字を連結していくことで62進数表現を生成しています。

サンプルコードでは、10進数「1,234,567,890」をconvertDecimalToBase62関数で62進数に変換し、その結果を表示しています。比較のために、同じ10進数をbase_convert関数が対応する最大の36進数に変換した場合の例も示されており、62進数変換の必要性と機能が具体的に理解できます。

PHP標準のbase_convert関数は、変換できる基数が2から36までに制限されているため、62進数など範囲外の変換には本サンプルコードのような独自の関数を実装する必要があります。提供されたconvertDecimalToBase62関数は非負の10進整数のみを対象とし、負の数や小数、他の進数からの変換には対応していません。62進数で利用される文字セットが変換結果に直接影響するため、変更時には注意が必要です。大規模な数値の変換や頻繁な利用を想定する場合、パフォーマンスや引数検証(例えば負の数に対するエラーハンドリング)の強化を検討してください。また、この関数は10進数から62進数への単方向変換のため、逆方向の変換が必要な場合は別途実装が必要です。

PHP base_convertで大きな数値を変換する

1<?php
2
3/**
4 * プログラミング言語PHPのbase_convert関数を使用して、異なる基数の間で数値を変換する例です。
5 * 特に、比較的大きな数値を文字列として扱い、基数変換を行う方法を示します。
6 *
7 * base_convert関数は、基数2から基数36までの間で数値を変換できます。
8 * 注意: base_convertは内部で浮動小数点数を使用する場合があるため、
9 * 非常に大きな整数を扱う際には精度が失われる可能性があります。
10 * この例では、一般的な64ビット整数に相当する範囲の数値を扱います。
11 */
12function convertLargeNumberBases(): void
13{
14    // 変換する大きな数値(16進数文字列として表現)
15    // この値は、一般的な32ビット整数型では扱えない「大きな数値」です。
16    $hexNumber = "DEADBEEFCAFEBABE";
17    echo "元の16進数 (base 16): " . $hexNumber . PHP_EOL;
18
19    // 16進数 (base 16) を2進数 (base 2) に変換
20    // 第1引数: 変換元の数値文字列
21    // 第2引数: 変換元の基数 (16進数なので16)
22    // 第3引数: 変換先の基数 (2進数なので2)
23    $binaryNumber = base_convert($hexNumber, 16, 2);
24    echo "2進数 (base 2) に変換: " . $binaryNumber . PHP_EOL;
25
26    // 2進数 (base 2) を10進数 (base 10) に変換
27    // 変換結果は文字列として返されるため、非常に長い10進数になる可能性があります。
28    $decimalNumber = base_convert($binaryNumber, 2, 10);
29    echo "10進数 (base 10) に変換: " . $decimalNumber . PHP_EOL;
30
31    // 10進数 (base 10) を元の16進数 (base 16) に戻す
32    // base_convertは結果のアルファベットを小文字で返します。
33    $revertedHexNumber = base_convert($decimalNumber, 10, 16);
34    echo "元の16進数 (base 16) に戻す (小文字): " . $revertedHexNumber . PHP_EOL;
35
36    // 元の16進数と戻した16進数を比較 (大文字・小文字を無視して比較)
37    if (strtolower($hexNumber) === $revertedHexNumber) {
38        echo "変換と逆変換は成功しました。" . PHP_EOL;
39    } else {
40        echo "変換と逆変換で不一致が発生しました。" . PHP_EOL;
41    }
42}
43
44// 関数を実行して変換処理を開始
45convertLargeNumberBases();
46
47?>

PHPのbase_convert関数は、数値の基数(進数)を変換するために使用されます。この関数は3つの引数を取ります。最初の$numには変換したい数値を文字列として指定し、2番目の$from_baseにはその数値が現在どの基数で表現されているかを整数で指定します。最後の$to_baseには、変換したい先の基数を整数で指定します。戻り値は変換された数値を表す文字列です。基数は2から36までの間で変換可能です。ただし、内部で浮動小数点数を使用する可能性があり、非常に大きな数値を扱うと精度が失われることがあるため注意が必要です。

このサンプルコードでは、一般的な64ビット整数に相当する範囲の「大きな数値」を文字列として扱い、その基数変換の挙動を示しています。具体的には、16進数で表現された大きな数値を指定し、それをbase_convert関数を使って2進数、さらに10進数へと順に変換しています。最終的に10進数から元の16進数へ戻すことで、変換の正確性を確認しています。変換結果はすべて文字列として扱われるため、非常に長い数値でも正しく処理されますが、base_convert関数は結果のアルファベットを小文字で返す点に留意してください。

PHPのbase_convert関数は、文字列として与えられた数値を指定された基数間で変換します。この関数は、内部で浮動小数点数を使用する可能性があるため、非常に大きな整数を変換すると精度が失われる恐れがあります。そのため、一般的な64ビット整数を超えるような数値を扱い、正確さが求められる場合は、BC Math拡張などの高精度計算ライブラリの利用を検討してください。変換元の基数と変換先の基数は2から36までの範囲で指定する必要があります。戻り値は常に文字列型であり、10進数以外の基数に変換された結果のアルファベットは小文字で返されますので、比較時には大文字・小文字の区別に注意が必要です。

関連コンテンツ