2012-01-30 4 views
8

अगर मैं निम्नलिखित बूलियन्ससुनिश्चित करें कि किसी दिए गए सूची का बिल्कुल एक बूलियन सत्य है?

const YESTERDAY = false; 
const TODAY = true; 
const TOMORROW = false; 

क्या कोड मुझे यकीन है कि ठीक एक सच है बनाने के लिए लिख सकते हैं है?

मैं इस की कोशिश की है:

$x = self::YESTERDAY^self::TODAY^self::TOMORROW; 

समस्या यह है कि सभी तीन स्थिरांक तो true करने के लिए सेट के साथ $xtrue है।

+0

आप या तो स्थिति का उपयोग कर सभी संयोजन डाल सकते हैं (YESTERDAY = true और आज = ​​झूठी और TOMORROW = झूठी) या (YESTERDAY = झूठा और आज = ​​सही और TOMORROW = झूठा) या (YESTERDAY = झूठा और आज = ​​झूठा और TOMORROW = सच) ' –

+0

उसे यह सुनिश्चित करने की ज़रूरत है कि सत्य एक है, कम से कम नहीं। – devdRew

उत्तर

8

$x = ((int) self::YESTERDAY) + ((int) self::TODAY) + ((int) self::TOMORROW); फिर $x === 1; आपको जो चाहिए वह आपको मिल गया है।

संपादित:

भी प्रकार के बिना @DaveRandom को (int) डाले, यह अच्छी तरह से काम करता है, धन्यवाद, इसलिए:

if (self::YESTERDAY + self::TODAY + self::TOMORROW == 1) {}, मेरे लिए के रूप में। असल में

if (array_sum(array(self::YESTERDAY, self::TODAY, self::TOMORROW)) == 1) { 
    // Do something 
} 

संपादित, तुम सब करने की जरूरत है यह ^ के साथ बदलें:

+0

मैंने इस बारे में सोचा लेकिन यह अतिरिक्त प्रसंस्करण से बचने के लिए अच्छा होगा, क्या ऐसा करने का थोड़ा सा तरीका है? – Matthew

+0

यह +1 - यह परीक्षण के बाद लगता है कि आपको '(int) 'casts की भी आवश्यकता नहीं है, यह निश्चित रूप से होता है। – DaveRandom

+1

यह किसी भी अन्य समाधान से कहीं अधिक कठिन है।@Matt XOR (^) ऑपरेटर का उपयोग करने में लगभग सही था, लेकिन दुर्भाग्यवश 'सत्य^सत्य^सत्य' का मूल्यांकन 'सत्य' होगा, क्योंकि PHP इसे '(सत्य^सत्य)^सत्य' के रूप में व्याख्या करता है, यानी 'false^true ' – WildlyInaccurate

0

बस के रूप में devdRew के जवाब

$x = array_count_values(array((int) self::YESTERDAY,(int) self::TODAY,(int) self::TOMORROW)); 
if (isset($x[1]) && $x[1] == 1) { 
    echo 'Only one TRUE'; 
} 
2

neatest तरह से मैं के बारे में सोच सकते हैं के लिए एक विकल्प array_sum() है आपके मूल प्रयास में +, और यह वही चीज़ प्राप्त करता है:

$x = self::YESTERDAY + self::TODAY + self::TOMORROW; 

यह TRUE मानों की संख्या में बदल जाता है। तो एक बूलियन उत्पादन में इस्तेमाल के लिए:

$ok = self::YESTERDAY + self::TODAY + self::TOMORROW === 1; 
+0

जो बहुत साफ है! – Matthew

+0

दरअसल devdRew के उत्तर पर एक भिन्नता सबसे अच्छी है - यदि आप अपने मूल कोड में '^' के साथ '^' को प्रतिस्थापित करते हैं तो यह वही काम करता है - आपको 'int (int) 'casts की आवश्यकता नहीं होती है क्योंकि यह स्पष्ट रूप से होता है। – DaveRandom

+0

यह भी साफ है! – Matthew

0

आप अपने चरों की सूची से अधिक लूप और तोड़ सकते हैं जब आप एक दूसरे बूलियन यह सच है पाया:

$moreThanOneTrue=false; 
$oneTrue; 
foreach ($BOOL_VAR_ARRAY as $bool) { 
    if ($bool) { 
     if($oneTrue) { 
      $moreThanOneTrue=true; 
      break; 
     } 
     $oneTrue=true; 
    } 
} 

इस तरह इसे और अधिक काम जब आपके पास है तीन से अधिक चर।

+0

यदि 3 से अधिक है तो मुझे लगता है कि 'array_sum' विधि इस – Matthew

+0

@Matt से सरल होगी: मैं सहमत हूं .. – ezdazuzena

0

x सत्य वापस आ जाएगा यदि केवल और यदि कोई सत्य है और अन्य झूठे हैं।

$x = ($a && !($b || $c)) || ($b && !($a || $c)) || ($c && !($a || $b)); 

खराब कोड हो सकता है, लेकिन काम करता है।

0

a^b^c^(a & b & c) वह एक्सप्रेसन है जिसे आप ढूंढते हैं।

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