我问的是如何转换KB MB GB TB&合。字节。
例如:
byteconvert("10KB") // => 10240
byteconvert("10.5KB") // => 10752
byteconvert("1GB") // => 1073741824
byteconvert("1TB") // => 1099511627776
依旧......
编辑:哇。我在4年前问过这个问题。这种事情真的告诉你,随着时间的推移你有多少改进!答案 0 :(得分:31)
这是实现这一目标的功能:
function convertToBytes(string $from): ?int {
$units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB'];
$number = substr($from, 0, -2);
$suffix = strtoupper(substr($from,-2));
//B or no suffix
if(is_numeric(substr($suffix, 0, 1))) {
return preg_replace('/[^\d]/', '', $from);
}
$exponent = array_flip($units)[$suffix] ?? null;
if($exponent === null) {
return null;
}
return $number * (1024 ** $exponent);
}
$testCases = ["13", "13B", "13KB", "10.5KB", "123Mi"];
var_dump(array_map('convertToBytes', $testCases));
输出:
array(5){[0] => int(13)[1] => int(13)[2] => int(13312)[3] => int(10752)[4] => NULL} int(1)
答案 1 :(得分:9)
function toByteSize($p_sFormatted) {
$aUnits = array('B'=>0, 'KB'=>1, 'MB'=>2, 'GB'=>3, 'TB'=>4, 'PB'=>5, 'EB'=>6, 'ZB'=>7, 'YB'=>8);
$sUnit = strtoupper(trim(substr($p_sFormatted, -2)));
if (intval($sUnit) !== 0) {
$sUnit = 'B';
}
if (!in_array($sUnit, array_keys($aUnits))) {
return false;
}
$iUnits = trim(substr($p_sFormatted, 0, strlen($p_sFormatted) - 2));
if (!intval($iUnits) == $iUnits) {
return false;
}
return $iUnits * pow(1024, $aUnits[$sUnit]);
}
答案 2 :(得分:4)
这是我到目前为止所提出的,我认为这是一个更优雅的解决方案:
/**
* Converts a human readable file size value to a number of bytes that it
* represents. Supports the following modifiers: K, M, G and T.
* Invalid input is returned unchanged.
*
* Example:
* <code>
* $config->human2byte(10); // 10
* $config->human2byte('10b'); // 10
* $config->human2byte('10k'); // 10240
* $config->human2byte('10K'); // 10240
* $config->human2byte('10kb'); // 10240
* $config->human2byte('10Kb'); // 10240
* // and even
* $config->human2byte(' 10 KB '); // 10240
* </code>
*
* @param number|string $value
* @return number
*/
public function human2byte($value) {
return preg_replace_callback('/^\s*(\d+)\s*(?:([kmgt]?)b?)?\s*$/i', function ($m) {
switch (strtolower($m[2])) {
case 't': $m[1] *= 1024;
case 'g': $m[1] *= 1024;
case 'm': $m[1] *= 1024;
case 'k': $m[1] *= 1024;
}
return $m[1];
}, $value);
}
答案 3 :(得分:3)
<?php
function byteconvert($input)
{
preg_match('/(\d+)(\w+)/', $input, $matches);
$type = strtolower($matches[2]);
switch ($type) {
case "b":
$output = $matches[1];
break;
case "kb":
$output = $matches[1]*1024;
break;
case "mb":
$output = $matches[1]*1024*1024;
break;
case "gb":
$output = $matches[1]*1024*1024*1024;
break;
case "tb":
$output = $matches[1]*1024*1024*1024;
break;
}
return $output;
}
$foo = "10mb";
echo "$foo = ".byteconvert($foo)." byte";
?>
答案 4 :(得分:2)
我使用一个函数来确定在某些cron脚本中为PHP设置的内存限制,如下所示:
$memoryInBytes = function ($value) {
$unit = strtolower(substr($value, -1, 1));
return (int) $value * pow(1024, array_search($unit, array(1 =>'k','m','g')));
}
类似的方法可以更好地使用浮点数并接受两个字母的缩写,如下所示:
function byteconvert($value) {
preg_match('/(.+)(.{2})$/', $value, $matches);
list($_,$value,$unit) = $matches;
return (int) ($value * pow(1024, array_search(strtolower($unit), array(1 => 'kb','mb','gb','tb'))));
}
答案 5 :(得分:1)
基于https://stackoverflow.com/a/17364338/1041470
改进:
/**
* Converts human readable file size into bytes.
*
* Note: This is 1024 based version which assumes that a 1 KB has 1024 bytes.
* Based on https://stackoverflow.com/a/17364338/1041470
*
* @param string $from
* Required. Human readable size (file, memory or traffic).
* For example: '5Gb', '533Mb' and etc.
* Allowed integer and float values. Eg., 10.64GB.
*
* @return int
* Returns given size in bytes.
*/
function cm_common_convert_to_bytes(string $from): ?int {
static $units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
$from = trim(check_plain($from));
// Get suffix.
$suffix = strtoupper(trim(substr($from, -2)));
// Check one char suffix 'B'.
if (intval($suffix) !== 0) {
$suffix = 'B';
}
if (!in_array($suffix, $units)) {
return FALSE;
}
$number = trim(substr($from, 0, strlen($from) - strlen($suffix)));
if (!is_numeric($number)) {
// Allow only float and integer. Strings produces '0' which is not corect.
return FALSE;
}
return (int) ($number * pow(1024, array_flip($units)[$suffix]));
}
答案 6 :(得分:0)
我知道这是一个相对古老的话题,但这是我在需要这种东西时有时必须使用的功能;如果功能不起作用,你可以原谅,我在手机上写了这个:
funtion intobytes($bytes, $stamp='b'){
$indx = array_search($stamp, array('b', 'kb', 'mb', 'gb', 'tb', 'pb', 'yb'));
if($indx > 0){
return $bytes * pow(1024, $indx);
}
return $bytes;
}
和紧凑
funtion intobytes($bytes, $stamp='b') {$indx=array_search($stamp,array('b','kb','mb','gb','tb','pb','yb'));if($indx > 0){return $bytes * pow(1024,$indx);} return $bytes;}
小心!
Brodde85;)
答案 7 :(得分:0)
由于各种原因,想要与此类似的东西并不太喜欢这里发布的其他解决方案,我决定编写自己的函数:
function ConvertUserStrToBytes($str)
{
$str = trim($str);
$num = (double)$str;
if (strtoupper(substr($str, -1)) == "B") $str = substr($str, 0, -1);
switch (strtoupper(substr($str, -1)))
{
case "P": $num *= 1024;
case "T": $num *= 1024;
case "G": $num *= 1024;
case "M": $num *= 1024;
case "K": $num *= 1024;
}
return $num;
}
它适应了Al Jey(空白处理)和John V(开关盒)这里提出的一些想法,但是没有正则表达式,不会调用pow(),让switch-case做它的东西不会中断,并且可以处理一些奇怪的用户输入(例如125952中的“123精彩KB”结果)。我确信有一个更优化的解决方案涉及更少的指令,但代码将更不干净/可读。
答案 8 :(得分:0)
另一个解决方案(IEC):
<?php
class Filesize
{
const UNIT_PREFIXES_POWERS = [
'B' => 0,
'' => 0,
'K' => 1,
'k' => 1,
'M' => 2,
'G' => 3,
'T' => 4,
'P' => 5,
'E' => 6,
'Z' => 7,
'Y' => 8,
];
public static function humanize($size, int $precision = 2, bool $useBinaryPrefix = false)
{
$base = $useBinaryPrefix ? 1024 : 1000;
$limit = array_values(self::UNIT_PREFIXES_POWERS)[count(self::UNIT_PREFIXES_POWERS) - 1];
$power = ($_ = floor(log($size, $base))) > $limit ? $limit : $_;
$prefix = array_flip(self::UNIT_PREFIXES_POWERS)[$power];
$multiple = ($useBinaryPrefix ? strtoupper($prefix) . 'iB' : $prefix . 'B');
return round($size / pow($base, $power), $precision) . $multiple;
}
// ...
}
来源:
https://github.com/mingalevme/utils/blob/master/src/Filesize.php https://github.com/mingalevme/utils/blob/master/tests/FilesizeTest.php
答案 9 :(得分:0)
根据标准,这里有一个更干净的版本(使用上面的答案):
/**
* Format kb, mb, gb, tb to bytes
*
* @param integer $size
* @return integer
*/
function formatToBytes ($size)
{
$aUnits = array('bytes' => 0, 'KB' => 1, 'MB' => 2, 'GB' => 3, 'TB' => 4);
$sUnit = strtoupper(trim(substr($size, -2)));
if (intval($sUnit) !== 0) {
$sUnit = 'bytes';
}
if (!in_array($sUnit, array_keys($aUnits))) {
return false;
}
$iUnits = trim(substr($size, 0, strlen($size) - 2));
if (!intval($iUnits) == $iUnits) {
return false;
}
return $iUnits * pow(1024, $aUnits[$sUnit]);
}