零基础写一个格式化字节数的函数
计算机存储器的大小通常用字节来表示,PHP 可通过 memory_get_peak_usage
函数来获取内存使用情况
echo memory_get_peak_usage();
// 18386056
这种显示方式不是很直观,如果能用对应的单位的表示的话会好很多
echo formatBytes(memory_get_peak_usage());
// 17.53 mb
下面我们来手动实现该函数。
首先,需要掌握一些基本常识
- 1 Byte = 2 的零次方 = 1024 的 0 次方 = 1
- 1 KB = 2 的 10 次方 = 1024 的 1 次方
- 1 MB = 2 的 20 次方 = 1024 * 1024 = 1024 的 2 次方
- 1 GB = 2 的 30 次方 = 1024 1024 1024 = 1024 的 3 次方
示例,将 3145728 字节格式化(打印 3 mb)。
$bytes = 3145728;
创建单位数组
$units = ["b", "kb", "mb", "gb", "tb"];
数组的索引刚好对应 1024 的对应次方,比如 kb
的索引为 1, 对应 1024 的一次方。因此,我们只需要算出对应的索引(次方)即可知道该字节数适用的单位。
因为 3145728 = 3 * 1024 * 1024
,只需要使用对数即可算出索引
$base = log($bytes, 1024);
// 2.15
$index = floor($base);
// 2
得出对应的单位
$unit = $units[$index];
// mb
接下来,计算字节数转换为对应单位的数值,分为两步
- 计算 1 MB 对应的字节数
- 总的字节数除以 1 MB 对应的字节数
$unitBytes = pow(1024, $index);
$memory = $bytes / $unitBytes;
最后,返回格式化的值即可
$result = $memory ." ". $unit;
完整函数
function formatBytes(int $bytes, int $precision = 2) : string
{
$units = ["b", "kb", "mb", "gb", "tb"];
if($bytes <= 0){
return false;
}
$index = floor(log($bytes, 1024));
if($index > 4) {
return false;
}
$memory = $bytes / pow(1024, $index);
return round($memory, $precision) ." " . $units[$index];
}
本作品采用《CC 协议》,转载必须注明作者和本文链接