零基礎寫一個格式化位元組數的函式

心智極客發表於2020-02-04

計算機儲存器的大小通常用位元組來表示,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 協議》,轉載必須註明作者和本文連結

終身程式設計者交流 QQ 群 1021204145

相關文章