Onların tamsayı eşdeğerlerine '256M gibi dizeleri ', '180K', '4 G 'dönüştürmek için PHP kolay bir yolu var mı?

4 Cevap

I ini_get('memory_limit') tarafından döndürülen değeri sınamak ve belli bir eşiğin altında ise ancak bu ini_get('memory_limit') çağırmak yerine tamsayılar daha ''128M gibi dize değerlerini verir, hafıza limitini artırmak gerekir.

Ben onları defalarca yazdım bu dizeleri (davayı alma ve hesaba 'B sondaki) ayrıştırmak için bir işlev yazabilirsiniz biliyorum:

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

Ancak, bu sıkıcı alır ve bu onu bulamadılar ama, zaten PHP var olacaktır bu rasgele şeylerden biri gibi görünüyor. Herkes bu bayt miktarı dizeleri ayrıştırmak için bazı yerleşik bir yol biliyor mu?

4 Cevap

Ben dışarı şans olduğunu düşünüyorum. Için PHP kılavuzu ini_get() (aslında) ini değerleri döndürür nasıl ini_get konusunda bir uyarı bu özel sorunu giderir.

Onlar tam olarak bunu yapmak için örneklerin birinde bir işlevi sağlamak, bu yüzden gitmek için yolu tahmin ediyorum:

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

Onlar yukarıdaki fonksiyonu hakkında söylenecek bu var: "Yukarıdaki örnekte çok PHP kaynak nasıl yapar gibi, bayt içine steno gösterimini dönüştürmek için bir yol gösterir."

Ya da bazı kısa versiyonu, sen memnun edersen

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

Ben sadece ne yaptığını üzerinde hafif varyasyon düşünebilirsiniz:

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