2009-08-26 8 views
12

मुझे ini_get('memory_limit') द्वारा दिए गए मान का परीक्षण करने की आवश्यकता है और यदि यह निश्चित सीमा से नीचे है तो मेमोरी सीमा बढ़ाएं, हालांकि ini_get('memory_limit') पूर्णांक की बजाय '128 एम' जैसे कॉल रिटर्न मानों को कॉल करता है।क्या PHP में '256M', '180K', '4G' जैसे स्ट्रिंग्स से कनवर्ट करने का कोई आसान तरीका उनके पूर्णांक समकक्षों में है?

मैं जानता हूँ कि मैं इन तार (मामले को ले और 'बी के खाते में अनुगामी) पार्स करने के लिए एक समारोह में लिख सकते हैं के रूप में मैं उन्हें कई बार लिखा है:

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 में पहले से मौजूद हैं, हालांकि मुझे यह कभी नहीं मिला है। क्या किसी को इन बाइट-रेंज स्ट्रिंग को पार्स करने के लिए कुछ अंतर्निहित तरीके से पता है?

उत्तर

5

मुझे लगता है कि आप भाग्य से बाहर रहे हैं। ini_get() के लिए PHP मैनुअल वास्तव में 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 स्रोत यह करता है। "

+0

में गायब 'ब्रेक' नोट करें जॉन के उत्तर के समान समस्या: वैकल्पिक पिछला बी – cletus

+1

हां, यह सच नहीं है। मैं इसे अधिकतर यह स्पष्ट करने के लिए प्रदान कर रहा था कि PHP मैनुअल ने यह कैसे किया है। यह काम करेगा यदि आप केवल 'ini_get()' के परिणामों का विश्लेषण करना चाहते हैं, अन्यथा आपको इसे स्वयं संशोधित करना होगा। पोस्टर प्रश्न का संक्षिप्त जवाब वास्तव में है "नहीं, एक अंतर्निहित विधि नहीं है।" – zombat

+0

मैं इस जानकारी को आईएनआई मानों के विवरण में और 'ini_get() 'फ़ंक्शन के लिए दस्तावेज़ों के अलावा अन्य सभी जगहों के बारे में जानकारी दे रहा था। इसे खोजने के लिए धन्यवाद। –

2

पीएचपी वेबसाइट से 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; 
} 
+0

कि वास्तव में पर वैकल्पिक बी प्रबंधन नहीं करती है समाप्त। – cletus

+0

अंत में बी के पास कब होता है? क्या वह मंच विशिष्ट है? –

+0

ओपी के रेगेक्स को देखें। अंत में एक वैकल्पिक बी है। – cletus

2

मैं केवल एक मामूली बदलाव के बारे में सोच सकते हैं कि तुम क्या कर रहे हैं:

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

मुझे वास्तव में मूल संस्करण भी पसंद है तो आपका और भी नहीं: कोई लूप नहीं। कम से कम कोई स्पष्ट loops :) – elcuco

4

या कुछ छोटा संस्करण है, अगर आप को खुश

function toInteger ($string) 
{ 
    sscanf ($string, '%u%c', $number, $suffix); 
    if (isset ($suffix)) 
    { 
     $number = $number * pow (1024, strpos (' KMG', strtoupper($suffix))); 
    } 
    return $number; 
} 
संबंधित मुद्दे

 संबंधित मुद्दे