PHP返回可读性更好的文件大小显示


返回可读性更好的文件大小显示

  • 方法一

<?php

    /**
     * 返回可读性更好的文件大小
     * 
     * @param $bytes  int 文件大小(字节数)
     * @param int $decimals 保留多少位数
     * @return string 带单位的文件大小字符串
     */
    function human_filesize ($bytes, $decimals = 2)
    {
        $size = ['B', 'kB', 'MB', 'GB', 'TB', 'PB'];
        // 舍去法取整
        $factor = floor((strlen($bytes) - 1) / 3);

        return sprintf("%.{$decimals}f", $bytes / pow(1024, $factor)) . @$size[$factor];
    }

?>

以上代码做详细解释如下

每相邻的两个存储单位之间以字节数长度的 3 倍做间隔,比如看以下表中所示

字节长度字节数换算B级KB级MB级GB级
410001000 / 10240.98 B
51000010000 / 10249.8 B
610000 010000 0 / 102498 B
710000 0010000 00 / 1024980 B0.95 KB
810000 00010000 000 / 10249800 B9.5 KB
910000 000010000 0000 / 102498000 B95 KB
1010000 0000 010000 0000 0 / 1024980000 B950 KB0.93 MB
1110000 0000 0010000 0000 00 / 1024980000 0 B950 KB9.3 MB
1210000 0000 00010000 0000 000 / 1024980000 00 B9500 KB93 MB
1310000 0000 000010000 0000 0000 / 1024980000B95000 KB930 MB0.91 GB

通过以上的规律,我们可以观察到每两个相邻的量级之间可以通过字节长度的 3 倍来划分,减 1 的话类比分页的页码计算,如果字节数长度刚好是 3 的倍数,应该归到前一个量级,比如字节数是 100 bytes,对应长度是 3,显然应该显示为 100B 更好,而不是用 KB 来显示。

  • 方法二

<?php

    /**
    * 对文件大小做可读性更好的显示
    *
    * @param integer $bytes    字节数  需要格式转换的字节数
    * @param integer $decimals 保留几位小数
    * @return float  处理好的字节数
    */
    function format_bytes($bytes, $decimals = 2) {
        $units = array('B', 'KB', 'MB', 'GB', 'TB', 'PB');
        for ($i = 0; $bytes >= 1024 && $i < 5; $i++) {
            $size = $bytes /= 1024;
            // 等同于以下代码
            // $size = $bytes = $bytes / 1024;
        }
        return round($size, $decimals) . $units[$i];
    }

>

调用方式

相比而言,方式一会比方式二可读性更加好一些


<?php


    $bytes1 = human_filesize(94875468);  // output: =>  90.48MB
    $bytes2 = format_bytes(94875468);  // output:  =>  90.48MB

    $bytes3 = human_filesize(1024000);  // output:  =>  0.98MB
    $bytes4 = format_bytes(1024000);  // output:  =>  1000KB

    var_dump($bytes1);
    var_dump($bytes2);
    var_dump($bytes3);
    var_dump($bytes4);

>

文章作者: Alex
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Alex !
评论
  目录