2011-07-02 15 views
5

के एक समूह से पहले गैर झूठी चर आवंटित करने के लिए मैं कैसे प्रभाव के बिना इस तरह की कोशिश की:उन्हें

$a = false; 
$b = false; 
$c = 'sometext'; 
$result = $a or $b or $c or exit('error: all variables are false'); 

और $ परिणाम $ ग सेट किया जाना चाहिए, लेकिन इस bool(false) का मूल्य बजाय देता है।

उत्तर

1

यहाँ पर जा रहा चीजों की एक जोड़ी है:

सबसे पहले, PHP में एक बूलियन आपरेशन के परिणाम एक बूलियन है।

दूसरे, और अधिक आसानी से, "अंग्रेज़ी" बूलियन ऑपरेटरों (or और and) एक कम precedence है - असाइनमेंट ऑपरेटर, = से कम है।

इसलिए इस अभिव्यक्ति में $result हमेशा की तरह, $ एक ($a के मूल्य की परवाह किए बिना) के वास्तविक मूल्य मिल जाएगा के बाद से काम बूलियन ऑपरेटर से पहले लागू किया जाता है।

// This has the same effect: 
$result = $a or $b or $c; 

// As this: 
$result = $a; 
$a or $b or $c; // this has no effect 

यह भ्रमित है, और लगभग निश्चित रूप से आप जो चाहते हैं उसे नहीं।

$a, $b के किसी भी है कि क्या, $c truthy (यानी true, या true को castable) है की बूलियन परिणाम प्राप्त करने के लिए आप या तो उपयोग कोष्ठक, पूर्वता मजबूर या "सी शैली" ऑपरेटर का उपयोग कर सकते हैं (|| और &&) जो एक उच्च पूर्वता है:

// These all have the same effect: 

$result = ($a or $b or $c); 
$result = $a || $b || $c; 

if ($a or $b or $c) 
    $result = true; 
else 
    $result = false; 

if ($a || $b || $c) 
    $result = true; 
else 
    $result = false; 

आप ऑपरेटर पूर्वता के बारे में अनिश्चित वह कोष्ठकों में उपयोग करने के लिए सबसे अच्छा है कर रहे हैं - के बाद से मूल्यांकन के आदेश किया जाता है, वे भी मदद करने के लिए कोड अधिक पठनीय बनाने के लिए करते हैं और अधिक स्पष्ट ।

यह आम तौर पर स्पष्ट प्रकार के रूपांतरणों (विशेष रूप से गैर-संख्यात्मक तारों कास्टिंग) पर निर्भर नहीं है, क्योंकि यह अस्पष्ट कोड के लिए बनाता है।

संपादित करें:

वास्तविक सवाल है, एक और दृष्टिकोण का उत्तर देने के (हालांकि मैं वास्तव में इस मामले में यह अनुशंसा नहीं करते हैं, क्योंकि आप कहते हैं कि तुम केवल पहली गैर झूठी मूल्य में रुचि रखते हैं) होगा कॉलबैक के बिना array_filter का उपयोग करने के लिए - जो सभी की सरणी को सुरक्षित रखने वाले इनपुट सरणी में मानों को वापस लाएगा।

जैसे:

$a = false; 
$b = false; 
$c = 'sometext'; 
$result = array_filter(array($a, $b, $c)); 

var_dump($result); 

आउटपुट:

array(1) { 
    [2]=> 
    string(8) "sometext" 
} 
4
($result = $a) || ($result = $b) || ($result = $c) || exit("no"); 

या आप 0 और रिक्त स्ट्रिंग आदि के रूप में झूठी गिनती नहीं चाहते हैं:

(($result = $a) !== false) || (($result = $b) !== false) || (($result = $c) !== false) || exit("no"); 

के बारे में है कि क्या यह वास्तव में पठनीय है लगता है। आप पुराने तरीके से भी उपयोग कर सकते हैं:

if ($a !== false) 
    $result = $a; 
elseif ($b !== false) 
    $result = $b; 
elseif ($c !== false) 
    $result = $c; 
else 
    exit("no"); 

संपादित करें: बस अगर आपको कभी गतिशील कुछ चाहिए ;-)।

foreach(array('a','b','c') as $key) 
    if (($result = $$key) !== false) 
    break; 
if ($result === false) 
    exit("no"); 
+0

तो मैं देख रहा हूँ वहाँ कोई चालाक रास्ता ... $ what_if_my_variable_is_very_very_long_and_descriptive_which_is_good_programming_practice – rsk82

2

एक बूलियन ऑपरेटर का परिणाम php में बूलियन है।

$a = false; 
$b = false; 
$c = 'sometext'; 
$result = null; 

foreach(array('a', 'b', 'c') as $k) 
{ 
    if($$k !== false) 
    { 
     $result = $$k; 
     break; 
    } 
} 

इसके अलावा, अपने चर को सरणी में ले जाने पर विचार करें।

6

के बारे में क्या:

$result = $a ?: $b ?: $c ?: exit('doh!'); 
+0

यह शायद होना चाहिए स्वीकार्य उत्तर –

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