PHP में बूलियन मूल्य में एक स्ट्रिंग पार्स करना


126

आज मैं PHP के साथ खेल रहा था, और मुझे पता चला कि स्ट्रिंग मान "सही" और "झूठे" सही ढंग से किसी स्थिति में बूलियन के लिए पार्स नहीं हैं, उदाहरण के लिए निम्नलिखित फ़ंक्शन पर विचार करें:

function isBoolean($value) {
   if ($value) {
      return true;
   } else {
      return false;
   }
}

यदि मैं निष्पादित करता हूं:

isBoolean("true") // Returns true
isBoolean("") // Returns false
isBoolean("false") // Returns true, instead of false
isBoolean("asd") // Returns true, instead of false

यह केवल "1" और "0" मानों के साथ काम करता है:

isBoolean("1") // Returns true
isBoolean("0") // Returns false

क्या "सच" और "झूठे" तार को बूलियन में विभाजित करने के लिए PHP में एक मूल कार्य है?


अपने कोड में, isBoolean("")झूठे वापस आ जाना चाहिए।
BoltClock

आपको एरिक कारन के उत्तर के स्वीकृत उत्तर को बदलने पर विचार करना चाहिए। यह आपको एक मूल कार्य दिखाता है जो आप से पूछते हैं।
कोड कमांडर

1
PHP इस बारे में नहीं सोचता कि स्ट्रिंग क्या कहती है, "झूठा" सिर्फ पांच वर्ण हैं जिनका कोई मतलब नहीं है। वे हालांकि कुछ हैं , इसलिए बूलियन मूल्य trueएक मानव पाठक के लिए भले ही मूल्यांकन करता है , यह अधिक सहज होगा जो इसका मतलब था FALSE
zeel

जवाबों:


413

ऐसा करने का एक मूल PHP तरीका है जो PHP के filter_var विधि का उपयोग करता है:

$bool = filter_var($value, FILTER_VALIDATE_BOOLEAN);

PHP के मैनुअल के अनुसार :

"1", "सही", "चालू" और "हाँ" के लिए TRUE लौटाता है। अन्यथा FALSE लौटाता है।

यदि FILTER_NULL_ON_FAILURE सेट है, तो FALSE केवल "0", "गलत", "बंद", "नहीं" और "" के लिए लौटा है, और NULL को सभी गैर-बूलियन मानों के लिए लौटा दिया गया है।


यह स्वीकृत उत्तर होना चाहिए था। PHP के कार्यों में निर्मित अपने स्वयं के निर्माण से बेहतर है। पहिया को सुदृढ़ करने की कोई आवश्यकता नहीं है! बहुत बुरा यह बहुत देर हो चुकी थी: पी
कैसर्फ

1
क्या यह तुलना के लिए मूल्य को कम करता है?
मोबिलेटेनमेंट

3
@Mobiletainment, हाँ - यह किसी भी आवरण को संभाल सकता है जिसकी आप $ मूल्य (झूठी, FALSE, FalSe, आदि) के लिए कल्पना कर सकते हैं
एरिक कैरन

मेरे छोर पर बोर्कड टेस्टकेस। तुलना के लिए === के बजाय प्रयुक्त ==। लोगों को भ्रमित न करने के लिए मेरी पूर्व टिप्पणी को हटा देगा।
औरिग

6
इस सवाल का जवाब मुझे गार्ड से पकड़ा क्योंकि आप ध्वज जोड़ने के लिए FILTER_NULL_ON_FAILUREकरने के लिए filter_var()समारोह और नहीं के साथ बदलने FILTER_VALIDATE_BOOLEANके रूप में मैंने सोचा था कि। यह निम्नलिखित कोड में परिणाम देगा जो मेरे लिए चाल था:$bool = filter_var($value, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)
Dragon54

14

कारण यह है कि सभी तार trueबूलियन में परिवर्तित करते समय मूल्यांकन करते हैं, सिवाय "0"और ""(खाली स्ट्रिंग) के।

निम्नलिखित समारोह वास्तव में क्या करेंगे आप क्या चाहते हैं: यह वास्तव में पीएचपी तरह बर्ताव करता है, लेकिन यह भी स्ट्रिंग का मूल्यांकन करता होगा "false"के रूप में false:

function isBoolean($value) {
   if ($value && strtolower($value) !== "false") {
      return true;
   } else {
      return false;
   }
}

दस्तावेज़ बताते हैं कि: http://php.net/manual/en/language.types.boolean.php :

बूलियन में परिवर्तित करते समय, निम्न मूल्यों को FALSE माना जाता है:

  • बूलियन FALSE ही
  • पूर्णांक 0 (शून्य)
  • फ्लोट 0.0 (शून्य)
  • खाली स्ट्रिंग, और स्ट्रिंग "0"
  • शून्य तत्वों के साथ एक सरणी
  • विशेष प्रकार NULL (परेशान चर सहित)
  • खाली टैग से बनाई गई SimpleXML ऑब्जेक्ट

हर दूसरे मूल्य को TRUE माना जाता है (किसी भी संसाधन सहित)।


2
+1 अच्छा है। (वहाँ एक स्ट्रेटोलर को चक कर सकता है, लेकिन यह इसके बारे में है।)
जॉन पार्कर

मुझे लगता है कि मिडपार्क का मतलब स्ट्रेटोवर ($ मूल्य) की 'झूठ' से तुलना करना था। एक शाब्दिक 'झूठे' को स्ट्रेटोवर में पारित करना थोड़ा सा है .... दस्ता? :)
पॉल डिक्सन

@Paul डिक्सन यूप, यही मैं बात कर रहा था। :-)
जॉन पार्कर

2
@ मर्को - अगर ($ मूल्य और& स्ट्रेटोलोवर ($ मूल्य)! == "अशुद्ध") {यदि आप फ्रेंच में काम कर रहे हैं; if ($ value && strtolower ($ value)! == "falsch") {जर्मन में; अगर ($ value && strtolower ($ value)! == "onwaar") {डच में ... आप समझ सकते हैं कि PHP में यह मानक के रूप में क्यों नहीं बनाया गया है
मार्क बेकर

1
"सभी गैर-खाली स्ट्रिंग बूलियन में कनवर्ट करते समय सच का मूल्यांकन करते हैं, सिवाय" 0 "के।"
बोल्टकॉक

5

केवल PHP "0"या खाली स्ट्रिंग झूठे के लिए मोटे; हर दूसरे गैर-खाली स्ट्रिंग सच करने के लिए मजबूर करते हैं। से मैनुअल :

बूलियन में परिवर्तित करते समय, निम्नलिखित मूल्यों पर विचार किया जाता है FALSE:

  • खाली स्ट्रिंग, और स्ट्रिंग "0"

आपको स्ट्रिंग्स "true"बनाम को संभालने के लिए अपना स्वयं का फ़ंक्शन लिखना होगा "false"। यहाँ, मैं सब कुछ मिथ्या मान लेता हूँ:

function isBoolean($value) {
   if ($value === "true") {
      return true;
   } else {
      return false;
   }
}

एक साइड नोट पर जिसे आसानी से संघनित किया जा सकता है

function isBoolean($value) {
   return $value === "true";
}

4

मुझे हाल ही में स्ट्रिंग्स को संभालने के लिए "ढीली" बूलियन रूपांतरण फ़ंक्शन की आवश्यकता थी, जैसे आप (अन्य चीजों के बीच) के बारे में पूछ रहे हैं। मुझे कुछ अलग दृष्टिकोण मिले और उनके माध्यम से चलाने के लिए परीक्षण डेटा का एक बड़ा सेट आया । कुछ भी मेरी आवश्यकताओं के अनुकूल नहीं है इसलिए मैंने अपना लिखा:

function loosely_cast_to_boolean($value) {
    if(is_array($value) || $value instanceof Countable) {
        return (boolean) count($value);
    } else if(is_string($value) || is_object($value) && method_exists($value, '__toString')) {
        $value = (string) $value;
        // see http://www.php.net/manual/en/filter.filters.validate.php#108218
        // see https://bugs.php.net/bug.php?id=49510
        $filtered = filter_var($value, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE);
        if(!is_null($filtered)) {
            return $filtered;
        } else {
            // "none" gets special treatment to be consistent with ini file behavior.
            // see documentation in php.ini for more information, in part it says: 
            // "An empty string can be denoted by simply not writing anything after 
            // the equal sign, or by using the None keyword".
            if(strtolower($value) === 'none') {
                $value = '';
            }
            return (boolean) $value;
        }
    } else {
        return (boolean) $value;
    }
}

ध्यान दें कि उन वस्तुओं के लिए जो दोनों गणनीय और स्ट्रिंग-कास्टेबल हैं, यह सत्यता का निर्धारण करने के लिए स्ट्रिंग मान पर गिनती का पक्ष लेंगे। यही है, अगर $object instanceof Countableयह (boolean) count($object)मान के बिना वापस आ जाएगा(string) $object

आप परीक्षण डाटा मैं इस्तेमाल किया और साथ ही कई अन्य कार्यों के लिए परिणाम के लिए व्यवहार देख सकते हैं यहां । उस छोटे से iframe से परिणामों को स्किम करना कठिन है, इसलिए आप एक पूर्ण पृष्ठ में स्क्रिप्ट आउटपुट देख सकते हैं , इसके बजाय (यह URL अनिर्दिष्ट है इसलिए यह हमेशा के लिए काम नहीं कर सकता है)। यदि किसी दिन वे लिंक मर जाते हैं, तो मैंने पास्टबिन पर भी कोड डाल दिया

"क्या सच होना चाहिए" और क्या चाहिए के बीच की रेखा बहुत मनमानी नहीं है; मेरे द्वारा उपयोग किए गए डेटा को मेरी आवश्यकताओं और सौंदर्य संबंधी प्राथमिकताओं के आधार पर वर्गीकृत किया गया है, आपका भिन्न हो सकता है।


यह फ़ंक्शन निर्दोष रूप से काम करता है, धन्यवाद! लेकिन आपके लिंक अब 404 हैं।
servermanfail

3

मैं इस निर्माण का उपयोग बूलियन में स्ट्रिंग के लिए कर रहा हूं, क्योंकि आप trueअधिकांश अन्य मूल्यों के लिए चाहते हैं:

$str = "true";
$bool = !in_array($str, array("false", "", "0", "no", "off"));

1

क्या "सच" और "झूठे" तार को बूलियन में विभाजित करने के लिए PHP में एक फ़ंक्शन है?

नहीं - दोनों तार हैं, और उन दोनों (जैसा कि आप कहते हैं) का मूल्यांकन करते हैं true। केवल खाली स्ट्रिंग का मूल्यांकन करते हैंfalse PHP में ।

इसके लिए आपको मैन्युअल रूप से परीक्षण करना होगा। यदि संभव हो तो, हालांकि, इसके बजाय "वास्तविक" बूलियन मूल्यों के साथ काम करना बेहतर होगा।


1
सभी तार truePHP में मूल्यांकन नहीं करते हैं ।
कोरीवर्ड

1
सही नहीं कर रहा था, बस स्पष्ट कर रहा था। यह कहना कि "दोनों तार हैं [और मूल्यांकन करें true]" एक नौसिखिया को गलत प्रभाव दे सकता है, विशेष रूप से सख्त टाइपिंग नियमों के साथ एक अन्य भाषा से जहां एक स्ट्रिंग एक स्ट्रिंग है और सामग्री तब मायने नहीं रखती है जब यह एक बूलियन में परिवर्तित हो रही हो (जैसे माणिक)।
कोरीवर्ड

1
"केवल खाली स्ट्रिंग्स PHP में झूठे का मूल्यांकन करते हैं।" लेकिन गैर-रिक्त स्ट्रिंग के बारे में क्या "0"? क्या यह भी मूल्यांकन नहीं करता है false?
14

0

सबसे आसान तरीका एक बूलियन में परिवर्तित करने के लिए;

    $flag = 'true';

    if( filter_var( $flag,FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE ) !== null) {
      $flag = filter_var($flag,FILTER_VALIDATE_BOOLEAN);
    }

    gettype($flag); // Would Return 'Boolean'
    echo 'Val: '.$flag; // Would Output 'Val: 1'

0

यदि आपका API केवल "सत्य" या "असत्य" तार को स्वीकार करता है , तो बाकी सब कुछ बन जाता हैnull , तो कोशिश करें:

$boolean = ['true' => true, 'false' => false][$inputString] ?? null;

यह मानता है कि $inputकोई वस्तु नहीं है। Null कोलेसस ( ??) PHP 7.0 में पेश किया गया था।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.