文件大小转换字节到 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

在这种情况下,

$forceFormatfalse$suffixtrue

我不明白为什么 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 都可能是假的,而且 运行 仍然是这种情况。 我该如何解决这个问题?

$bytes0 时,表达式 $bytes >= 1073741824 && $forceFormat === false 的计算结果为 falseswitch 语句跳转到表达式匹配 $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)