Есть ли простой способ в PHP преобразовать из строк, таких как «256M», «180K», «4G» в их целочисленные эквиваленты?

Мне нужно проверить значение, возвращаемое ini_get('memory_limit') и увеличить предел памяти, если он ниже определенного порога, однако этот ini_get('memory_limit') возвращает строковые значения, такие как «128M», а не целые.

Я знаю, что могу написать функцию для синтаксического анализа этих строк (учитывая случай и учитывать «В»), поскольку я написал их много раз:

 function int_from_bytestring ($byteString) { preg_match('/^\s*([0-9.]+)\s*([KMGTPE])B?\s*$/i', $byteString, $matches); $num = (float)$matches[1]; switch (strtoupper($matches[2])) { case 'E': $num = $num * 1024; case 'P': $num = $num * 1024; case 'T': $num = $num * 1024; case 'G': $num = $num * 1024; case 'M': $num = $num * 1024; case 'K': $num = $num * 1024; } return intval($num); } 

Тем не менее, это становится утомительным, и это похоже на одну из тех случайных вещей, которые уже существуют в PHP, хотя я ее так и не нашел. Кто-нибудь знает какой-то встроенный способ анализа этих строк байтов?

Related of "Есть ли простой способ в PHP преобразовать из строк, таких как «256M», «180K», «4G» в их целочисленные эквиваленты?"

Я думаю, тебе не повезло. Руководство PHP для ini_get () действительно решает эту проблему в предупреждении о том, как ini_get () возвращает значения ini.

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

 function return_bytes($val) { $val = trim($val); $last = strtolower($val[strlen($val)-1]); switch($last) { // The 'G' modifier is available since PHP 5.1.0 case 'g': $val *= 1024; case 'm': $val *= 1024; case 'k': $val *= 1024; } return $val; } 

У них есть это, чтобы сказать о вышеупомянутой функции: «В приведенном выше примере показан один способ преобразования сокращенной нотации в байты, как это делает PHP-источник».

Или немного более короткую версию, если хотите

 function toInteger ($string) { sscanf ($string, '%u%c', $number, $suffix); if (isset ($suffix)) { $number = $number * pow (1024, strpos (' KMG', strtoupper($suffix))); } return $number; } 

На веб-сайте PHP для ini_get() :

 function return_bytes($val) { $val = trim($val); $last = strtolower($val[strlen($val)-1]); switch($last) { // The 'G' modifier is available since PHP 5.1.0 case 'g': $val *= 1024; case 'm': $val *= 1024; case 'k': $val *= 1024; } return $val; } 

Я могу только думать о небольшом изменении того, что вы делаете:

 function int_from_bytestring($byteString) { $ret = 0; if (preg_match('!^\s*(\d+(?:\.\d+))\s*([KMNGTPE])B?\s*$!', $byteString, $matches)) { $suffix = " KMGTPE"; $index = strpos($suffix, $matches[2]); if ($index !== false) { $ret = $matches[1]; while ($index--) { $matches *= 1024; } } } return intval($ret); }