পিএইচপি-তে "যদি / অন্যথায়" শর্টহ্যান্ড হিসাবে আমি কীভাবে টার্নারি অপারেটর (?:) ব্যবহার করব?


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
এটা সঠিক দেখাচ্ছে। আপনি কি পরীক্ষার প্রতিধ্বনি করার চেষ্টা করেছেন?
ব্রায়ান ফিশার 21

আপনার প্রশ্নটি কিছু স্বেচ্ছাসেবক এবং গবেষককে বোকা বানাচ্ছে কারণ আপনি শর্টহ্যান্ড ত্রৈমাসিক অভিব্যক্তি (কোনও "এলভিস অপারেটর" নেই) ব্যবহার করে কোনও অ্যাসাইনমেন্ট লিখছেন না - আপনি লম্বা হাতের ত্রৈমাসিক অভিব্যক্তি লিখছেন are পার্থক্যটি হ'ল আপনি মূল্যায়নের উপর নির্ভর করে প্রত্যাবর্তিত দুটি মানই ঘোষণা করছেন। সংক্ষিপ্ত মূল্যায়নে, ইনপুট মানটি যদি "সত্যবাদী" হয় তবে তা ফিরে আসে; যদি এটি "মিথ্যা" হয় তবে ফলব্যাক মানটি ফিরে আসবে (এটি হল এলভিস অপারেটরের পরে ঘোষিত মান)। এখানেও নুল কোলেসিং অপারেটরটির লক্ষণীয়ভাবে খারাপ প্রয়োগ রয়েছে।
মিকম্যাকুসা

উত্তর:


234

দ্য

(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খালি নেই তখন সম্পাদন করছেন uting আপনি শর্তসাপেক্ষ অপারেটরের সাথে একইভাবে করতে পারবেন না। আপনি যা করতে পারেন তা echoশর্তসাপেক্ষ অপারেটরের ফলাফল:

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

এবং এটি "রাস্তার খালি!" প্রদর্শিত হবে যদি এটি খালি থাকে, অন্যথায় এটি রাস্তার 2 ঠিকানা প্রদর্শন করবে।


এটি বিবৃতি এবং অভিব্যক্তির মধ্যে পার্থক্য
বিকাল 9:30 '

2
শর্টহ্যান্ড আবার কি? এটি সত্য যদি condition ?: falseমূল্যায়ন condition?
ওল্ডবয়

44

পিএইচপি 7+

পিএইচপি 7 হিসাবে, এই কাজটি নুল কোলেসেসিং অপারেটরটিকে এভাবে ব্যবহার করে কেবল সম্পাদন করা যেতে পারে :

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


3
$address['street2']খালি এফআইআই, যদি খালি স্ট্রিং থাকে। এটি এটি গ্রহণ করবে এবং ফিরে আসবে না 'Empty'isset() != empty()। এটি কেবল তখনই কাজ করবে যদি মানটি হয়null
AFWcxx

ঠিক আছে, আমি কেবল একটি উদাহরণ প্রদান করছিলাম। তবে আমি কোডটি সংশোধন করেছি। ধন্যবাদ!
রবিন লামা ডং

2
$address['street2']খালি না হলে আউটপুট কী ?
AliN11

যদি $ ঠিকানা ['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- উদাহরণ


2
আপনি এটি সংক্ষিপ্ত হাতের ওয়েবসাইট থেকে পেয়েছেন এবং এমনকি এটির
রিচার্ড

1
@ রিচার্ড রেফারেন্স যুক্ত করেছেন
অরুণ যোকেশ

তাই কি ? স্ট্যাকওভারফ্লো প্রসঙ্গে এটি সর্বদা একটি পাতলা রেখা, আমি বলতে চাইছি প্রশ্নটি নিজেকে জিজ্ঞাসা করেছিল, নিজের দ্বারা এটি খুঁজে পেতে অক্ষম এবং অন্য কেউ এই সামগ্রী সরবরাহ করেছিল। বিদ্যমান কন্টেন্টটি অনুলিপি করা যদি এটি এই প্রশ্নোত্তরে / এ মান যোগ করে এবং মান যোগ করে তবে কি অন্যায়? আমি মনে করি স্ট্যাক ওভারফ্লোতে উত্তরগুলি "আপনার নিজস্ব সামগ্রী" নয় ... হুম
স্লিক

প্রথম উদাহরণটি ভুল। )ভুল স্থানে রাখা হয়েছে। এটা পূর্বে করা উচিত ?। সম্পূর্ণ বিবৃতিটি হতে হবে$is_admin = ($user['permissions'] == 'admin') ? true : false;
1934286

12

টেরিনারি অপারেটর কেবলমাত্র একটি সংক্ষিপ্ত হাত এবং যদি / অন্য ব্লক। আপনার ওয়ার্কিং কোডের অন্য কোনও শর্ত নেই, সুতরাং এটি উপযুক্ত নয়।

নিম্নলিখিত উদাহরণটি কাজ করবে:

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

6

এটি টার্নারি অপারেটর ওরফে এলভিস অপারেটর (গুগল এটি: পি) আপনি সন্ধান করছেন।

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

ভেরিয়েবলটি খালি থাকলে এটি ভেরিয়েবলের মান বা ডিফল্ট প্রদান করে।


@ চালিত আপনি যা বলছেন তা নিয়ে আমি দ্বিমত পোষণ করতে পারছি না তবে এর জন্য গুগল করা আপনাকে ভাল ফলাফল দেবে এবং এটি মনে করিয়ে দেওয়া আরও সহজ একটি শব্দ
কীবোর্ড নিনজা

4

মনে রাখবেন যে নেস্টেড শর্তসাপেক্ষ অপারেটরগুলি ব্যবহার করার সময়, আপনি সম্ভাব্য সমস্যাগুলি এড়াতে প্রথম বন্ধনী ব্যবহার করতে চাইতে পারেন !

দেখে মনে হচ্ছে পিএইচপি কমপক্ষে জাভাস্ক্রিপ্ট বা সি # এর মতো কাজ করে না।

$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');

জাভাস্ক্রিপ্ট এবং সি # তে একই কোড উভয় ক্ষেত্রেই "ব্যতিক্রমী" প্রদান করে।

২ য় ক্ষেত্রে, পিএইচপি যা করে তা হ'ল (বা কমপক্ষে এটি আমি বুঝতে পারি):

  1. হয় $score > 10? হ্যাঁ
  2. হয় $age > 10? না, সুতরাং বর্তমান $age > 10 ? 'Average' : 'Exceptional''ব্যতিক্রমী' ফেরত দেয়
  3. তারপরে, কেবলমাত্র পুরো বিবৃতিটি থামিয়ে 'ব্যতিক্রমী' ফিরিয়ে দেওয়ার পরিবর্তে এটি পরবর্তী বিবৃতিটির মূল্যায়ন অব্যাহত রাখে
  4. পরের বিবৃতিটি 'Exceptional' ? 'Horrible' : 'Average''ভয়ংকর' প্রত্যাবর্তন করে, যেমনটি 'ব্যতিক্রমী' সত্য

ডকুমেন্টেশন থেকে: http://php.net/manual/en/language.operators.compistance.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').'!';

নেস্টেড পিএইচপি শর্টহ্যান্ড

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

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

টার্নারি অপারেটরটি / অন্য বিবৃতিটির জন্য মূলত শর্টহ্যান্ড। আমরা কয়েকটি লাইনের কোড কমাতে এবং পাঠযোগ্যতা বাড়িয়ে তুলতে ব্যবহার করতে পারি।

আপনার কোডটি আমার কাছে আরও পরিষ্কার দেখাচ্ছে। তবে আমরা আরও ক্লিনার উপায়ে নিম্নলিখিত হিসাবে যুক্ত করতে পারি-

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

অন্য উপায়-

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

দ্রষ্টব্য- আমি আরও পরিস্কারভাবে ব্র্যাককে এটি পরিস্কার করার জন্য যুক্ত করেছি। আমি সাধারণত পাঠযোগ্যতা বাড়াতে এটি করতাম। পিএইচপি 7 এর সাহায্যে আমরা নল কোয়েলসিং অপারেটর / পিএইচপি 7 ব্যবহার করতে পারি ?? আরও ভাল পদ্ধতির জন্য অপারেটর । তবে আপনার প্রয়োজনীয়তা এটি খাপ খায় না।


-1

একটি শর্টহ্যান্ড টেরিনারি অপারেটরও রয়েছে এবং এটি দেখতে এরকম দেখাচ্ছে:

(এক্সপ্রেশন 1)?: এক্সপ্রেশন 2 যদি অন্যথায় সত্য বা এক্সপ্রেশন 2 এর মূল্যায়ন করে তবে এক্সপ্রেশন 1 ফিরে আসবে ।

উদাহরণ:

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

ফিরে আসবে

Apples are great!

পিএইচপি 5.3 থেকে, টার্নারি অপারেটরের মাঝের অংশটি ছেড়ে দেওয়া সম্ভব। এক্সপ্রেশন এক্সপ্রেস 1?: এক্সপ্রেস 3 এক্সপ্রেস 1 প্রদান করে যদি এক্সপ্রেস 1 সত্যের সাথে মূল্যায়ন করে, এবং অন্যথায় এক্সপ্রেস 3 দেয়।

থেকে পিএইচপি ম্যানুয়াল

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.