文件大小转换字节到 kb/mb/gb 函数没有按预期工作
filesize conversion bytes to kb/mb/gb function does not work as expected
我有这个功能:
function formatSizeUnits($bytes,array $options = array()){
$forceFormat = isset($options["forceFormat"]) ? $options["forceFormat"] : false;
$suffix = !isset($options["suffix"]) || $options["suffix"] === true ? true : false;
switch($bytes):
case $forceFormat === "gb":
case $bytes >= 1073741824 && $forceFormat === false:
$bytes = number_format($bytes / 1073741824, 2) . ($suffix === true ? " GB" : "");
break;
case $forceFormat === "mb":
case $bytes >= 1048576 && $forceFormat === false:
$bytes = number_format($bytes / 1048576, 2) . ($suffix === true ? " MB" : "");
break;
case $forceFormat === "kb":
case $bytes >= 1024 && $forceFormat === false:
$bytes = number_format($bytes / 1024, 2) . ($suffix === true ? " KB" : "");
break;
case $forceFormat === "b":
case $bytes > 1 && $forceFormat === false:
$bytes = $bytes . ($suffix === true ? " bytes" : "");
break;
case $bytes == 1 && $forceFormat === false:
$bytes = $bytes . ($suffix === true ? " byte" : "");
break;
default:
$bytes = "0".($suffix === true ? " bytes" : "");
endswitch;
return $bytes;
}
当我 运行 它是这样的:
formatSizeUnits(0);
它return是这样的:
0.00 GB
在这种情况下,$forceFormat
是 false
,$suffix
是 true
。
我不明白为什么 return 在 GB
中。我希望 return 只是 0 bytes
。
当我在第一个 switch 语句(gb
中的一个)中放入 var_dump
时,它表示:
case $forceFormat === "gb":
case $bytes >= 1073741824 && $forceFormat === false:
var_dump($bytes >= 1073741824, $forceFormat);
结果:
(bool(false)
bool(false)
我想知道为什么 $bytes >= 1073741824
和 $forceFormat
都可能是假的,而且 运行 仍然是这种情况。
我该如何解决这个问题?
当 $bytes
为 0
时,表达式 $bytes >= 1073741824 && $forceFormat === false
的计算结果为 false
。 switch
语句跳转到表达式匹配 $bytes
的第一个 case
。以下脚本演示了 false
匹配 0
.
<?php
switch (0) {
case false:
echo '0 is false';
break;
case true:
echo '0 is true';
break;
default:
echo '0 is something else';
break;
}
?>
因为您想跳转到第一个 case
,即 true
,所以您应该使用 switch (true)
。
我有这个功能:
function formatSizeUnits($bytes,array $options = array()){
$forceFormat = isset($options["forceFormat"]) ? $options["forceFormat"] : false;
$suffix = !isset($options["suffix"]) || $options["suffix"] === true ? true : false;
switch($bytes):
case $forceFormat === "gb":
case $bytes >= 1073741824 && $forceFormat === false:
$bytes = number_format($bytes / 1073741824, 2) . ($suffix === true ? " GB" : "");
break;
case $forceFormat === "mb":
case $bytes >= 1048576 && $forceFormat === false:
$bytes = number_format($bytes / 1048576, 2) . ($suffix === true ? " MB" : "");
break;
case $forceFormat === "kb":
case $bytes >= 1024 && $forceFormat === false:
$bytes = number_format($bytes / 1024, 2) . ($suffix === true ? " KB" : "");
break;
case $forceFormat === "b":
case $bytes > 1 && $forceFormat === false:
$bytes = $bytes . ($suffix === true ? " bytes" : "");
break;
case $bytes == 1 && $forceFormat === false:
$bytes = $bytes . ($suffix === true ? " byte" : "");
break;
default:
$bytes = "0".($suffix === true ? " bytes" : "");
endswitch;
return $bytes;
}
当我 运行 它是这样的:
formatSizeUnits(0);
它return是这样的:
0.00 GB
$forceFormat
是 false
,$suffix
是 true
。
我不明白为什么 return 在 GB
中。我希望 return 只是 0 bytes
。
当我在第一个 switch 语句(gb
中的一个)中放入 var_dump
时,它表示:
case $forceFormat === "gb":
case $bytes >= 1073741824 && $forceFormat === false:
var_dump($bytes >= 1073741824, $forceFormat);
结果:
(bool(false)
bool(false)
我想知道为什么 $bytes >= 1073741824
和 $forceFormat
都可能是假的,而且 运行 仍然是这种情况。
我该如何解决这个问题?
当 $bytes
为 0
时,表达式 $bytes >= 1073741824 && $forceFormat === false
的计算结果为 false
。 switch
语句跳转到表达式匹配 $bytes
的第一个 case
。以下脚本演示了 false
匹配 0
.
<?php
switch (0) {
case false:
echo '0 is false';
break;
case true:
echo '0 is true';
break;
default:
echo '0 is something else';
break;
}
?>
因为您想跳转到第一个 case
,即 true
,所以您应该使用 switch (true)
。