零基础写一个格式化字节数的函数

计算机存储器的大小通常用字节来表示,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. 计算 1 MB 对应的字节数
  2. 总的字节数除以 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 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!