【PHP実践|実務向け】PHPでファイルサイズを人間が読みやすい形式に変換する実用テクニック

1. 導入

Webアプリケーションを開発していると、ファイルアップロード機能などで取得した「バイト単位の数値」を、ユーザーに見やすく表示する場面に多々遭遇します。例えば、「10485760バイト」と表示されても、ユーザーは直感的に容量を把握できません。これを「10.00MB」のように変換して表示することは、優れたUXを提供するための基本的な課題解決の一つです。本稿では、汎用的に利用可能なフォーマット関数を紹介します。

2. 基礎知識

コンピュータのデータ量は通常「バイト(Byte)」を基準としますが、1KB=1024バイトという2進数ベースの計算が一般的です。PHPの標準関数であるfilesize()などは、このバイト数を戻り値として返します。この数値を1024で繰り返し割ることで、KB、MB、GBといった単位へ昇格させることができます。数学的な手法としては、対数関数(log関数)を用いて「1024の何乗か」を求めるのが最も効率的です。

3. 実装/解決策

実務で利用する場合、以下の要件を満たす関数を作成するのが理想的です。
・小数点以下の桁数を指定できる(精度調整)。
・3桁ごとのカンマ区切りに対応する(視認性向上)。
・単位の境界を超えた場合(PB以上など)も考慮する。
これらを実現するために、log()関数で単位のインデックスを特定し、number_format()で整形を行うロジックを採用します。

4. サンプルプログラム

以下は、そのままプロジェクトにコピー&ペーストして利用できる実用的な関数です。

  • バイト数を人間が読みやすい形式(KB, MB, GB等)に変換
  • @param int|float $size バイト数
  • @param int $dec 小数点以下の表示桁数(-1で自動)
  • @param bool $separate カンマ区切りにするか
  • @return string
  • /
    function byte_format($size, $dec = 2, $separate = true) {
    $units = [‘B’, ‘KB’, ‘MB’, ‘GB’, ‘TB’, ‘PB’];

    // 0の場合はそのまま返す
    if ($size <= 0) return '0 B'; // 1024を底とした対数をとり、単位のインデックスを算出 $digits = floor(log($size, 1024)); // 定義された単位数を超える場合は最後の単位(PB)に合わせる $max_index = count($units) - 1; $index = min($digits, $max_index); // 該当する単位で割って数値を算出 $num = $size / pow(1024, $index); // 小数点以下の処理 $formatted_num = ($dec >= 0) ? sprintf(“%.{$dec}f”, $num) : (string)$num;

    // カンマ区切りの適用
    if ($separate) {
    $formatted_num = number_format((float)$formatted_num, ($dec >= 0) ? $dec : 0);
    }

    return $formatted_num . ‘ ‘ . $units[$index];
    }

    // 使用例
    echo byte_format(1024); // 1.00 KB
    echo byte_format(109951162777600); // 100.00 TB
    ?>

    5. 応用・注意点

    注意すべきポイントとして、極端に大きな数値を扱う際は、PHPの環境設定(int型の最大値など)に依存する可能性があります。64bit環境であれば基本的に問題ありませんが、さらに巨大な数値を扱う場合はbcmath拡張の使用を検討してください。
    また、実務では「1KB=1000バイト」として扱う業界(ストレージ業界など)と「1024バイト」として扱うOS・Web業界で定義が分かれることがあります。要件に応じて、1024の部分を1000に変更するなど、柔軟に調整を行ってください。

    タイトルとURLをコピーしました