例を挙げて、私が期待していることを説明しましょう。例:ファイルサイズが「3147483648バイト」で、次の適切なファイルサイズに変換したい:2 GB + 70 MB + 333 KB+512バイト。
どんな助けでも大歓迎です。
あなたはそのためにあなた自身の関数を書くことができます:
bytes = filesize % 1024;
filesize = (int)(filesize / 1024);
kbytes = filesize % 1024;
filesize = (int)(filesize / 1024);
等々...
私は解決策を見つけました。再帰の使い方はあまり好きではありませんが、欲しいものが得られます。
function shortenBytes($sizeInBytes){
$units = array('Bytes', 'KB', 'MB', 'GB', 'TB', 'PB' , 'EB', 'ZB', 'YB');
$resultArray = array(
'YB' => 0,'ZB' => 0,'EB' => 0,'PB' => 0,'TB' => 0,
'GB' => 0,'MB' => 0,'KB' => 0,'Bytes' => 0);
$remainder = $sizeInBytes;
$i = count($units);
while($i >= 0)
{
$pownumber = pow(1024, $i);
if($sizeInBytes >= $pownumber){
$resultArray[$units[$i]] = (int)($sizeInBytes / $pownumber);
$remainder = abs($sizeInBytes % $pownumber);
$i--;
$remainder = recursiveGetUnitArray($remainder,$i,$resultArray);
}
$sizeInBytes = $remainder;
$i--;
}
return $resultArray;
}
function recursiveGetUnitArray($sizeInBytes, $i, &$resultArray){
$units = array('B', 'KB', 'MB', 'GB', 'TB', 'PB' , 'EB', 'ZB', 'YB');
$remainder = $sizeInBytes;
$pownumber = pow(1024, $i);
if($sizeInBytes >= $pownumber){
$resultArray[$units[$i]] = (int)($sizeInBytes / $pownumber);
$remainder = abs($sizeInBytes % $pownumber);
$i--;
$remainder = recursiveGetUnitArray($remainder,$i,$resultArray);
}
return $remainder;
}
結果としてshortenBytes(3147483648);
array (size=9)
'YB' => int 0
'ZB' => int 0
'EB' => int 0
'PB' => int 0
'TB' => int 0
'GB' => int 2
'MB' => int 70
'KB' => int 333
'Bytes' => int 512
公式のphp.netWebサイトを参照してください。
<?php
function human_filesize($bytes, $decimals = 2) {
$sz = 'BKMGTP';
$factor = floor((strlen($bytes) - 1) / 3);
return sprintf("%.{$decimals}f", $bytes / pow(1024, $factor)) . @$sz[$factor];
}
?>