PHP конвертирует KB MB GB TB и т. Д. В байты

Я спрашиваю, как конвертировать KB MB GB TB & co. в байты.
Например:

byteconvert("10KB") // => 10240 byteconvert("10.5KB") // => 10752 byteconvert("1GB") // => 1073741824 byteconvert("1TB") // => 1099511627776 

и так далее…

EDIT: ничего себе. Я задал этот вопрос более 4 лет назад. Эти вещи действительно показывают вам, насколько вы со временем улучшились!

Related of "PHP конвертирует KB MB GB TB и т. Д. В байты"

Только потому, что я не мог найти ничего, кроме Google.

 function convertToBytes($from){ $number=substr($from,0,-2); switch(strtoupper(substr($from,-2))){ case "KB": return $number*1024; case "MB": return $number*pow(1024,2); case "GB": return $number*pow(1024,3); case "TB": return $number*pow(1024,4); case "PB": return $number*pow(1024,5); default: return $from; } } 
 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]); } 
 <?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"; ?> 

Вот что я придумал до сих пор, я думаю, это гораздо более элегантное решение:

 /** * 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); } 

Я использую функцию для определения ограничения памяти для PHP в некоторых скриптах cron, которые выглядят так:

 $memoryInBytes = function ($value) { $unit = strtolower(substr($value, -1, 1)); return (int) $value * pow(1024, array_search($unit, array(1 =>'k','m','g'))); } 

Аналогичный подход, который будет лучше работать с float и принять аббревиатуру двух букв, будет примерно таким:

 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')))); } 

Я знаю, что это относительная старая тема, но вот функция, которую мне иногда приходится использовать, когда мне нужны такие вещи; Вы можете извинить, если функции не работают, я написал это для руки на мобильном устройстве:

 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;)

Если вы хотите что-то подобное этому и не совсем понравитесь другим решениям, размещенным здесь по разным причинам, я решил написать свою собственную функцию:

 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 (switch-case), но без регулярного выражения, не вызывает pow (), позволяет случай переключения делать свое дело, когда нет перерывов , и может обрабатывать некоторые странные пользовательские входы (например, «123 замечательных КБ» результаты 125952). Я уверен, что существует более оптимальное решение, которое требует меньше инструкций, но код будет менее чистым / удобочитаемым.

Еще одно решение (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