Portál AbcLinuxu, 12. května 2025 07:05
Řešení dotazu:
Podmínkou zjistit jestli je číslo (počet bytů) větší než počet bytů o jeden řád větší, potom dosaď jednotky.
function hatatitla($byte){
if($byte<1000){$kolik=$byte;$jednotka="B";}
elseif($byte>=1000){$kolik=$byte/1000;$jednotka="kB";}
elseif($byte>=1000000){$kolik=$byte/1000000;$jednotka="MB";}
//atd atd
return "".$kolik." ".$jednotka.""; }
echo hatatitla(1000); //vrati 1kB
function fsize_unit_convert($bytes) { $units = array('b', 'kb', 'mb', 'gb'); $converted = $bytes . ' ' . $units[0]; for ($i = 0; $i < count($units); $i++) { if (($bytes/pow(1024, $i)) >= 1) { $converted = round($bytes/pow(1024, $i), 2) . ' ' . $units[$i];} } return $converted; } }
$i = (int) log($bytes, 2) / 10;
HMST: 5.052839040756 sec (HumanReadableSizeTest) HMS: 6.325034141540 sec (HumanReadableSize) FSC: 23.292122125626 sec (fsize_unit_convert) FSCL: 7.134121179580 sec (fsize_unit_convert_log)Zdrojový kód v příloze spuštěný z řádku
php -f test.php
. :)
function fsize_unit_convert_log_optimized($bytes) { static $units = array( array( ' B', 1), array(' KiB', 1024.), array(' MiB', 1048576.), array(' GiB', 1073741824.), array(' TiB', 1099511627776.), ); $u = & $units[(int) log($bytes, 2) / 10]; return round($bytes / $u[1], 2).$u[0]; }
Test finished HMST: 4.99683594704 sec (HumanReadableSizeTest) HMS: 5.82857894897 sec (HumanReadableSize) FSC: 21.1713778973 sec (fsize_unit_convert) FSCL: 6.77399015427 sec (fsize_unit_convert_log) FSCL2: 4.63680100441 sec (fsize_unit_convert_log_optimized):-P
<?php $def_blockSize_1000 = Array(Array(1.0,'B'), Array(1000.0,'kB'), Array(1000000.0,'MB'), Array(1000000000.0,'GB'), Array(1000000000000.0,'TB')); $def_blockSize_1024 = Array(Array(1.0,'B'), Array(1024.0,'KiB'), Array(1024.0*1024.0,'MiB'), Array(1024.0*1024.0*1024.0,'GiB'), Array(1024.0*1024.0*1024.0*1024.0,'TiB')); function HumanReadableSize($value, $ain,$decimal=2,$dec_points='.',$thousands_sep='') { if($value < 0) return "?"; for($i = count($ain)-1;$i > 0;$i--) { if($value > $ain[$i][0]) return number_format((float)$value / $ain[$i][0],$decimal,$dec_points,$thousands_sep) . $ain[$i][1]; } return $value . $ain[0][1]; } echo "SI <br />\n"; echo "900B = " . HumanReadableSize(900,$def_blockSize_1000) ." <br />\n"; echo "1101B =" . HumanReadableSize(1101,$def_blockSize_1000) ." <br />\n"; echo "1200123B = " . HumanReadableSize(1200123,$def_blockSize_1000) ." <br />\n"; echo "1307895456B = " . HumanReadableSize(1307895456,$def_blockSize_1000) ." <br />\n"; echo "1571597537412B ≈ " . HumanReadableSize(1571597537412,$def_blockSize_1000) ." <br />\n"; echo "Binary <br />\n"; echo "900B = " . HumanReadableSize(900,$def_blockSize_1024) ." <br />\n"; echo "1101B = " . HumanReadableSize(1101,$def_blockSize_1024) ." <br />\n"; echo "1200123B = " . HumanReadableSize(1200123,$def_blockSize_1024) ." <br />\n"; echo "1307895456B = " . HumanReadableSize(1307895456,$def_blockSize_1024) ." <br />\n"; echo "1571597537412B ≈ " . HumanReadableSize(1571597537412,$def_blockSize_1024) ." <br />\n"; return; ?>PS: pokud pracujete s velkými čísly (v terách a v 64bit Integer-u) udělejte to už na straně SQL.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.