2011-06-01 13 views
12

मैं टर्नरी ऑपरेटरों का बहुत उपयोग करता हूं लेकिन मैं एक दूसरे के अंदर कई टर्नरी ऑपरेटर को ढेर नहीं लग सकता।PHP में एकाधिक टर्नरी ऑपरेटर को कैसे संयोजित करें?

मुझे पता है कि कई त्रिगुट ऑपरेटर स्टैकिंग कोड कम पठनीय होगा हूँ, लेकिन कुछ मामले में मैं यह करने के लिए करना चाहते हैं।

$foo = 1; 
$bar = ($foo == 1) ? "1" : ($foo == 2) ? "2" : "other"; 
echo $bar; // display 2 instead of 1 

सही सिंटैक्स क्या है:

यह वही है मैं अब तक की कोशिश की है है? प्रत्येक भीतरी त्रिगुट ऑपरेटर के आसपास

+0

के संभावित डुप्लिकेट काम करेंगे [नेस्टेड php त्रिगुट मुसीबत: त्रिगुट उत्पादन = अगर - और] (http://stackoverflow.com/questions/4807454/nested -php-ternary-trouble-ternary-output-if-else) –

+0

सभी को महान उत्तर दें। – Cybrix

उत्तर

17

उन कोष्ठक मैं क्या लगता है कि तुम हो रही है कर रहे हैं।

प्रयास करें

$foo = 1; 
$bar = ($foo == 1) ? "1" : (($foo == 2) ? "2" : "other"); 
echo $bar; 
3

रखें कोष्ठक, इस तरह से ऑपरेटर प्राथमिकता का आश्वासन दिया जाता है:

$bar = ($foo == 1) ? "1" : (($foo == 2) ? "2" : "other"); 
2

जोड़े कोष्टक:

$bar = ($foo == 1) ? "1" : (($foo == 2) ? "2" : "other"); 
4

आप सही ढंग से इस प्रकार इस लिख सकते हैं:

$bar = ($foo == 1) ? "1" : (($foo == 2) ? "2" : "other"); 

(यानी: बस कोष्ठक में 'आंतरिक' त्रिगुट ऑपरेटर एम्बेड ।)

हालांकि, मैं वास्तव में ऐसा करने का लुत्फ उठाऊंगा, क्योंकि यह एक विशेष रूप से गैरकानूनी चीज़ के रूप में पठनीय है जिसे बुरी तरह से धुंधला कर दिया गया है - इस पर कोई समस्या नहीं है, और इस सीमा पर इसका कोई बहाना नहीं है।

16

समस्या यह है कि PHP, अन्य सभी भाषाओं के विपरीत, सशर्त ऑपरेटर को सहयोगी छोड़ दिया जाता है। यह आपके कोड को तोड़ता है - जो अन्य भाषाओं में ठीक होगा।

+1

"_ नोटिस कि मैंने आपके कोड से अन्य कोष्ठक हटा दिए हैं, लेकिन ये सही थे, बस redundant_" - लेकिन इस तरह के एक पार्सर के साथ, आप कभी भी सुनिश्चित नहीं हो सकते ... ;-) – Alnitak

8

आप के आसपास कुछ कोष्ठकों की जरूरत है;

$bar = $foo == 1 ? "1" : ($foo == 2 ? "2" : "other"); 

(। लेकिन इन, सही सिर्फ निरर्थक थे सूचना है कि मैं अपने कोड से अन्य कोष्ठकों को हटा दिया है):

आप कोष्ठक का उपयोग करने की आवश्यकता है सही हाथ संकार्य:

$foo = 1; 
$bar = ($foo == 1) ? "1" : (($foo == 2) ? "2" : "other"); 
echo $bar; 

PHP के दुभाषिया टूटा हुआ है और अपनी लाइन व्यवहार करता है:

$bar = ($foo == 1) ? "1" : ($foo == 2) ? "2" : "other"; 

$bar = (($foo == 1) ? "1" : ($foo == 2)) ? "2" : "other"; 

के रूप में और कहा कि बाएं हाथ अभिव्यक्ति शेष त्रिगुट ऑपरेटर के "सही" पहले संकार्य के रूप में मूल्यांकन करता है के बाद से ("2") के बजाय दिया जाता है।

+0

-1 टूटा हुआ? पार्सर वास्तव में PHPs ऑपरेटर प्राथमिकता और सहयोगीता अवलोकन द्वारा परिभाषित किया गया है: http://php.net/manual/en/language.operators.precedence.php – NikiC

+2

@nikic PHP के मैन्युअल ने कार्यान्वयन को दस्तावेज किया - दस्तावेज _define_ कार्यान्वयन नहीं करते हैं , क्योंकि PHP के पास कभी औपचारिक विनिर्देश नहीं था। टर्नरी ऑपरेटर का समर्थन करने वाली हर दूसरी भाषा की तुलना में कार्यान्वयन टूट जाता है (यानी अलग)। – Alnitak

+0

यदि आप यह कहना चाहते थे कि यह आपके लिए उपयोग किए जाने वाले कार्यों से अलग था, तो ऐसा क्यों न कहें? – NikiC

2

बस कोष्टक टिके रहते हैं, और आप इसे मिल गया है:

$bar = ($foo==1? "1" : ($foo==2? "2" : "other")); 

एक के रूप में एक तरफ, अगर आप कई खंड मिल गया है, तो आप एक switch उपयोग करने पर विचार करना चाहिए:

switch ($bar) { 
    case 1: echo "1"; 
    case 2: echo "2"; 
    default: echo "other"; 
} 

यदि स्विच लंबा हो जाता है, तो आप इसे फ़ंक्शन में लपेट सकते हैं।

2
$foo = 1; 
$bar = ($foo == 1) ? "1" : (($foo == 2) ? "2" : "other"); 
echo $bar; 

बस अतिरिक्त का उपयोग करें() और यह

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