मैं PHP में "अगर / और" के लिए शॉर्टहैंड के रूप में टर्नरी ऑपरेटर (?:) का उपयोग कैसे करूं?


118

इस पृष्ठ के उदाहरणों के आधार पर , मेरे पास नीचे काम करने वाले और गैर-काम करने वाले कोड नमूने हैं।

ifबयान का उपयोग कर काम कोड :

if (!empty($address['street2'])) echo $address['street2'].'<br />';

गैर-कामकाजी कोड जो टर्नरी ऑपरेटर का उपयोग कर रहा है:

$test = (empty($address['street2'])) ? 'Yes <br />' : 'No <br />';

// Also tested this
(empty($address['street2'])) ? 'Yes <br />' : 'No <br />';

अद्यतन
ब्रायन की नोक के बाद, मैंने पाया कि प्रतिध्वनि $testअपेक्षित परिणाम का उत्पादन करती है। निम्नलिखित एक आकर्षण की तरह काम करता है!

echo (empty($storeData['street2'])) ? 'Yes <br />' : 'No <br />';

4
यह सही लग रहा है। क्या आपने $ परीक्षण की प्रतिध्वनि करने की कोशिश की है ?;
ब्रायन फिशर

आपका प्रश्न कुछ स्वयंसेवकों और शोधकर्ताओं को बेवकूफ बना रहा है क्योंकि आप शॉर्टहैंड टर्नरी एक्सप्रेशन (कोई "एल्विस ऑपरेटर" नहीं है) का उपयोग करके असाइनमेंट नहीं लिख रहे हैं - आप एक लॉन्गहैंड टर्नरी एक्सप्रेशन लिख रहे हैं। अंतर यह है कि आप मूल्यांकन के आधार पर दोनों लौटे मूल्यों की घोषणा कर रहे हैं। शॉर्टहैंड मूल्यांकन में, यदि इनपुट मान "सत्य" है, तो इसे वापस कर दिया जाता है; यदि यह "गलत" है, तो फ़ॉलबैक मूल्य वापस आ जाता है (यह एल्विस ऑपरेटर के बाद घोषित मूल्य है)। यहाँ पर नल Coalescing Operator का भी काफी खराब कार्यान्वयन है।
मिकमैकुसा

जवाबों:


234

The

(condition) ? /* value to return if condition is true */ 
            : /* value to return if condition is false */ ;

सिंटैक्स "शॉर्टहैंड अगर" ऑपरेटर नहीं है ( ?इसे सशर्त ऑपरेटर कहा जाता है) क्योंकि आप कोड को उसी तरीके से निष्पादित नहीं कर सकते जैसे आपने किया था:

if (condition) {
    /* condition is true, do something like echo */
}
else {
    /* condition is false, do something else */
}

अपने उदाहरण में, आप echoस्टेटमेंट को निष्पादित कर रहे हैं जब $addressखाली नहीं है। आप सशर्त ऑपरेटर के साथ ऐसा नहीं कर सकते। हालांकि आप क्या कर सकते हैं, echoसशर्त ऑपरेटर का परिणाम है:

echo empty($address['street2']) ? "Street2 is empty!" : $address['street2'];

और यह प्रदर्शित करेगा "स्ट्रीट खाली है!" यदि यह खाली है, अन्यथा यह सड़क 2 पता प्रदर्शित करेगा।


यह कथन और अभिव्यक्ति के बीच का अंतर है
पीरिन्दा

2
फिर से शॉर्ट्स क्या है? condition ?: falseजो मूल्यांकन करता है conditionकि क्या यह सच है?
ओल्डबॉय जूल

44

PHP 7+

PHP 7 के रूप में, इस कार्य को बस इस तरह नल coalescing ऑपरेटर का उपयोग करके किया जा सकता है :

echo !empty($address['street2']) ?? 'Empty';


3
बस FYI, अगर $address['street2']एक खाली स्ट्रिंग है। यह इसे स्वीकार करेगा और वापस नहीं आएगा 'Empty'isset() != empty()। यह तभी काम करेगा जब मान होnull
AFwcxx

खैर, मैं सिर्फ एक उदाहरण प्रदान कर रहा था। लेकिन मैंने कोड को संशोधित किया है। धन्यवाद !
राबिन लामा डोंग

2
यदि $address['street2']रिक्त नहीं है तो आउटपुट क्या है ?
अलीएन

यदि $ पता ['Street2'] खाली नहीं है, तो यह "सत्य" के कुछ रूप का उत्पादन करेगा। उपरोक्त का सामान्य रूप अधिक है: echo $address['street2'] ?? 'Empty';हालांकि जैसा कि उल्लेख किया गया है, यह " अशक्त सहवर्ती ऑपरेटर" है, इसलिए यह केवल शून्य के लिए परीक्षण करता है और खाली नहीं होता है। यह है क्योंकि ?? प्रभावी रूप से isset () के लिए एक आशुलिपि है।
ब्रायन सी

1
बस इस जवाब को नीचा दिखाने के लिए हस्ताक्षर किए। यह सब क्या विज्ञापन नहीं है।
TKoL

28

मूल सत्य / असत्य घोषणा

$is_admin = ($user['permissions'] == 'admin' ? true : false);

सशर्त स्वागत संदेश

echo 'Welcome '.($user['is_logged_in'] ? $user['first_name'] : 'Guest').'!';

सशर्त आइटम संदेश

echo 'Your cart contains '.$num_items.' item'.($num_items != 1 ? 's' : '').'.';

रेफरी: https://davidwalsh.name/php-ternary-examples


2
आपने इसे शॉर्ट हैंड वेबसाइट से प्राप्त किया और इसका संदर्भ भी नहीं दिया
रिचर्ड

1
@ रिचर्ड ने संदर्भ जोड़ा
अरुण योकेश

क्या यह ? StackOverflow के संदर्भ में, यह हमेशा एक पतली रेखा होती है, मेरा मतलब है कि क्यू ने कुछ मांगा है, उसे उसके द्वारा स्वयं को खोजने में असमर्थ है, और फिर किसी और ने यह सामग्री वितरित की है। क्या मौजूदा सामग्री की प्रतिलिपि बनाना अनुचित है यदि यह इस Q / A में मदद करता है और मूल्य जोड़ता है? मुझे लगता है कि स्टैकऑवरफ्लो पर उत्तर "आपकी अपनी सामग्री" नहीं हैं ... हम्म
सलीक

पहला उदाहरण गलत है। )गलत स्थान पर है। यह पहले से होना चाहिए ?। पूरा बयान होना चाहिए$is_admin = ($user['permissions'] == 'admin') ? true : false;
1934286

12

टर्नरी ऑपरेटर सिर्फ और सिर्फ / और ब्लॉक के लिए शॉर्टहैंड है। आपके वर्किंग कोड में कोई और शर्त नहीं है, इसलिए इसके लिए उपयुक्त नहीं है।

निम्न उदाहरण काम करेगा:

echo empty($address['street2']) ? 'empty' : 'not empty';

6

यह टर्नेरी ऑपरेटर उर्फ ​​एल्विस ऑपरेटर है (इसे Google: P) आप ढूंढ रहे हैं।

echo $address['street2'] ?: 'Empty'; 

यदि चर खाली है तो यह चर या डिफ़ॉल्ट का मान लौटाता है।


@Structed मैं इससे सहमत नहीं हो सकता कि आप क्या कहते हैं लेकिन, इसके लिए गुगली करने से आपको प्रॉपर रिजल्ट मिलेगा और यह याद दिलाने का एक आसान शब्द है
कीबोर्ड निंजा

4

ध्यान दें कि नेस्टेड सशर्त ऑपरेटरों का उपयोग करते समय, आप संभावित मुद्दों से बचने के लिए कोष्ठक का उपयोग करना चाह सकते हैं !

ऐसा लगता है कि PHP कम से कम जावास्क्रिप्ट या C # के समान काम नहीं करता है।

$score = 15;
$age = 5;

// The following will return "Exceptional"
echo 'Your score is: ' . ($score > 10 ? ($age > 10 ? 'Average' : 'Exceptional') : ($age > 10 ? 'Horrible' : 'Average'));

// The following will return "Horrible"
echo 'Your score is: ' . ($score > 10 ? $age > 10 ? 'Average' : 'Exceptional' : $age > 10 ? 'Horrible' : 'Average');

जावास्क्रिप्ट और सी # रिटर्न में एक ही कोड दोनों मामलों में "असाधारण"।

दूसरे मामले में, PHP क्या करता है (या कम से कम मुझे जो समझ में आता है):

  1. है $score > 10? हाँ
  2. है $age > 10? नहीं, इसलिए वर्तमान $age > 10 ? 'Average' : 'Exceptional'रिटर्न 'असाधारण'
  3. तब, केवल पूरे बयान को रोकने और 'असाधारण' वापस करने के बजाय, यह अगले बयान का मूल्यांकन करना जारी रखता है
  4. अगला बयान 'Exceptional' ? 'Horrible' : 'Average''भयानक' लौटता है, क्योंकि 'असाधारण' सत्य है

प्रलेखन से: http://php.net/manual/en/language.operators.comparison.php

यह अनुशंसा की जाती है कि आप "स्टैकिंग" टर्नरी अभिव्यक्तियों से बचें। एक बयान के भीतर एक से अधिक टर्नरी ऑपरेटर का उपयोग करते समय PHP का व्यवहार गैर-स्पष्ट है।


3

त्वरित और छोटा तरीका:

echo $address['street2'] ? : "No";

एक या अधिक विविध स्थितियों के साथ यहां कुछ दिलचस्प उदाहरण दिए गए हैं।

$color = "blue";

// Condition #1 Show color without specifying variable 
echo $color ? : "Undefined";
echo "<br>";

// Condition #2
echo $color ? $color : "Undefined";
echo "<br>";

// Condition #3
echo ($color) ? $color : "Undefined";
echo "<br>";

// Condition #4
echo ($color == "blue") ? $color : "Undefined";
echo "<br>";

// Condition #5
echo ($color == "" ? $color : ($color == "blue" ? $color : "Undefined"));
echo "<br>";

// Condition #6
echo ($color == "blue" ? $color : ($color == "" ? $color : ($color == "" ? $color : "Undefined")));
echo "<br>";

// Condition #7
echo ($color != "") ? ($color != "" ? ($color == "blue" ? $color : "Undefined") : "Undefined") : "Undefined";
echo "<br>";

2

सशर्त स्वागत संदेश

echo 'Welcome '.($user['is_logged_in'] ? $user['first_name'] : 'Guest').'!';

नेस्टेड PHP आशुलिपि

echo 'Your score is:  '.($score > 10 ? ($age > 10 ? 'Average' : 'Exceptional') : ($age > 10 ? 'Horrible' : 'Average') );

2

आप बदल कर भी इस भी कम कर सकते हैं echoके साथ<?= code ?>

<?=(empty($storeData['street2'])) ? 'Yes <br />' : 'No <br />'?>

यह विशेष रूप से तब उपयोगी होता है, जब आप यह निर्धारित करना चाहते हैं, कि एक नावबार के अंदर, क्या मेनू विकल्प को पहले से ही विज़िट किए गए (क्लिक किए गए) या:

<li<?=($basename=='index.php' ? ' class="active"' : '')?>><a href="index.php">Home</a></li>


क्या उस में <(?>?> विधि की आवश्यकता है)?
कर्ल

0

मुझे लगता है कि आपने कोष्ठक को गलत तरीके से इस्तेमाल किया। इसे इस्तेमाल करे:

$test = (empty($address['street2']) ? 'Yes <br />' : 'No <br />');

मुझे लगता है कि यह काम करना चाहिए, आप भी उपयोग कर सकते हैं:

echo (empty($address['street2']) ? 'Yes <br />' : 'No <br />');

0

मुझे लगता है कि आपको शायद php में ternary ऑपरेटर का उपयोग नहीं करना चाहिए। अगले उदाहरण पर विचार करें:

<?php

function f1($n) {
    var_dump("first funct");
    return $n == 1;
}

function f2($n) {
    var_dump("second funct");
    return $n == 2;
}


$foo = 1;
$a = (f1($foo)) ? "uno" : (f2($foo)) ? "dos" : "tres";
print($a);

आप कैसे सोचते हैं, किस $aचर में क्या होगा? (संकेत: डॉस) और यह वैसा ही रहेगा भले ही $fooचर 2 को सौंपा जाएगा।

चीजों को बेहतर बनाने के लिए आपको या तो इस ऑपरेटर का उपयोग करने से इंकार करना चाहिए या निम्नलिखित तरीके से ब्रेसिज़ के साथ दाहिने हिस्से को घेरना चाहिए:

$a = (f1($foo)) ? "uno" : ((f2($foo)) ? "dos" : "tres");

0

Ternary Operator मूल रूप से if / else स्टेटमेंट के लिए शॉर्टहैंड है। हम कोड की कुछ लाइनों को कम करने और पठनीयता बढ़ाने के लिए उपयोग कर सकते हैं।

आपका कोड मुझे साफ दिखता है। लेकिन हम इस प्रकार और अधिक क्लीनर तरीका जोड़ सकते हैं-

$test = (empty($address['street2'])) ? 'Yes <br />' : 'No <br />';

दूसरा रास्ता-

$test = ((empty($address['street2'])) ? 'Yes <br />' : 'No <br />');

नोट- मैंने इसे स्वच्छ बनाने के लिए पूरी अभिव्यक्ति में ब्रैकेट जोड़ा है। मैं आमतौर पर पठनीयता बढ़ाने के लिए ऐसा करता था। PHP7 के साथ हम Null Coalescing Operator / php 7 का उपयोग कर सकते हैं ?? बेहतर दृष्टिकोण के लिए ऑपरेटर । लेकिन आपकी आवश्यकता यह फिट नहीं है।


-1

एक शॉर्टहैंड टर्नरी ऑपरेटर भी है और यह इस तरह दिखता है:

(expression1): expression2 वापस आ जाएगी expression1 अगर यह सच है या करने के लिए मूल्यांकन करता है expression2 अन्यथा।

उदाहरण:

$a = 'Apples';
echo ($a ?: 'Oranges') . ' are great!';

वापस होगा

Apples are great!

PHP 5.3 के बाद से, टर्नरी ऑपरेटर के मध्य भाग को छोड़ना संभव है। Expr1 ?: expr3 रिटर्न expr1 अगर expr1 TRUE का मूल्यांकन करता है, और expr3 अन्यथा।

से पीएचपी मैनुअल

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