यहाँ पर जा रहा चीजों की एक जोड़ी है:
सबसे पहले, 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"
}
तो मैं देख रहा हूँ वहाँ कोई चालाक रास्ता ... $ what_if_my_variable_is_very_very_long_and_descriptive_which_is_good_programming_practice – rsk82