ฉันจะใช้ตัวดำเนินการ ternary (? :) ใน PHP เป็นชวเลขสำหรับ“ if / else” ได้อย่างไร


118

จากตัวอย่างจากหน้านี้ฉันมีตัวอย่างโค้ดที่ใช้งานได้และไม่ทำงานด้านล่าง

รหัสการทำงานโดยใช้ifคำสั่ง:

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

รหัสที่ไม่ทำงานโดยใช้ตัวดำเนินการ ternary:

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

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

อัปเดต
หลังจากคำแนะนำของ Brian ฉันพบว่าการสะท้อนให้$testผลลัพธ์ที่คาดหวัง ผลงานต่อไปนี้อย่างจับใจ!

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

4
มันดูถูกต้อง คุณได้ลอง echo $ test แล้วหรือยัง?
Brian Fisher

คำถามของคุณกำลังหลอกอาสาสมัครและนักวิจัยบางคนเพราะคุณไม่ได้เขียนงานโดยใช้นิพจน์เกี่ยวกับชวเลข (ไม่มี "Elvis Operator") - คุณกำลังเขียนสำนวนที่เกี่ยวพันกับระยะยาว ความแตกต่างคือคุณกำลังประกาศค่าที่ส่งคืนทั้งสองค่าขึ้นอยู่กับการประเมิน ในการประเมินชวเลขถ้าค่าอินพุตเป็น "จริง" จะส่งคืน ถ้าเป็น "falsey" ค่าทางเลือกจะถูกส่งกลับ (นี่คือค่าที่ประกาศหลังจากตัวดำเนินการ Elvis) นอกจากนี้ยังมีการใช้งาน Null Coalescing Operator ที่ไม่ดีอย่างเห็นได้ชัดที่นี่ด้วย
mickmackusa

คำตอบ:


234

The

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

ไวยากรณ์ไม่ใช่ตัวดำเนินการ "ชวเลข if" ( ?เรียกว่าตัวดำเนินการตามเงื่อนไข) เนื่องจากคุณไม่สามารถรันโค้ดในลักษณะเดียวกับที่คุณทำ:

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'];

และจะแสดงข้อความ "Street is empty!" ถ้าว่างมิฉะนั้นจะแสดงที่อยู่ถนน 2


ความแตกต่างระหว่างคำสั่งและการแสดงออก
pmiranda

2
ชวเลขอะไรอีกแล้ว condition ?: falseซึ่งประเมินconditionว่าเป็นจริงหรือไม่?
oldboy

44

PHP 7+

ใน PHP 7 งานนี้สามารถทำได้ง่ายๆโดยใช้ตัวดำเนินการประสาน Nullดังนี้:

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


3
เพียงแค่ FYI ถ้า$address['street2']เป็นสตริงว่าง 'Empty'มันจะยอมรับมันและจะไม่กลับมา isset() != empty(). สิ่งนี้จะใช้ได้ก็ต่อเมื่อค่าเป็นnull
AFwcxx

ผมแค่ยกตัวอย่าง แต่ฉันได้แก้ไขโค้ดแล้ว ขอบคุณ!
Rabin Lama Dong

2
ผลลัพธ์คืออะไรถ้า$address['street2']ไม่ว่างเปล่า?
AliN11

ถ้า $ address ['street2'] ไม่ว่างเปล่ามันจะแสดงรูปแบบ "true" ออกมา รูปแบบปกติของข้างต้นมีลักษณะเหมือนกันมากกว่า: echo $address['street2'] ?? 'Empty';อย่างไรก็ตามตามที่กล่าวไว้มันเป็น " ตัวดำเนินการรวมเป็นโมฆะ " ดังนั้นจึงทดสอบเฉพาะค่าว่างและไม่ว่างเปล่า นี้เป็นเพราะ ?? เป็นชวเลขสำหรับ isset () ได้อย่างมีประสิทธิภาพ
Brian C

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
คุณได้มาจากเว็บไซต์มือสั้นและไม่ได้อ้างอิง
Richard

1
@Richard เพิ่มการอ้างอิง
Arun Yokesh

ใช่ไหม ? ในบริบทของ StackOverflow มันเป็นเส้นบาง ๆ เสมอฉันหมายถึง Q ที่ขอบางสิ่งบางอย่างไม่สามารถหาได้จากตัวเขาเองจากนั้นก็มีคนอื่นส่งเนื้อหานี้มาให้ การคัดลอกเนื้อหาที่มีอยู่ไม่เป็นธรรมหรือไม่หากช่วยและเพิ่มมูลค่าให้กับคำถาม / คำตอบนี้ ฉันคิดว่าคำตอบใน StackOverflow ไม่ใช่ "เนื้อหาของคุณเอง" ... อืม
Sliq

ตัวอย่างแรกไม่ถูกต้อง )ถูกใส่ผิดที่ ควรนำหน้าไฟล์?. คำชี้แจงฉบับสมบูรณ์ควรเป็น$is_admin = ($user['permissions'] == 'admin') ? true : false;
1934286

12

ตัวดำเนินการ ternary เป็นเพียงชวเลขสำหรับและ if / else block รหัสการทำงานของคุณไม่มีเงื่อนไขอื่นดังนั้นจึงไม่เหมาะสำหรับสิ่งนี้

ตัวอย่างต่อไปนี้จะใช้งานได้:

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

6

มันเป็นตัวดำเนินการ Ternary หรือที่เรียกว่า Elvis operator (google it: P) ที่คุณกำลังมองหา

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

จะส่งคืนค่าของตัวแปรหรือค่าเริ่มต้นหากตัวแปรว่างเปล่า


@Structed ฉันไม่เห็นด้วยกับสิ่งที่คุณพูด แต่ googling สำหรับสิ่งนี้จะทำให้คุณได้ผลลัพธ์ที่ยอดเยี่ยมและเป็นคำศัพท์ที่ง่ายกว่าในการเตือน
Keyboard ninja

4

โปรดทราบว่าเมื่อใช้ตัวดำเนินการตามเงื่อนไขที่ซ้อนกันคุณอาจต้องการใช้วงเล็บเพื่อหลีกเลี่ยงปัญหาที่อาจเกิดขึ้น!

ดูเหมือนว่า PHP จะไม่ทำงานในลักษณะเดียวกับ Javascript หรือ 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');

โค้ดเดียวกันใน Javascript และ C # ส่งคืน "พิเศษ" ในทั้งสองกรณี

ในกรณีที่ 2 PHP ทำอะไร (หรืออย่างน้อยก็คือสิ่งที่ฉันเข้าใจ):

  1. คือ$score > 10? ใช่
  2. คือ$age > 10? ไม่ดังนั้น$age > 10 ? 'Average' : 'Exceptional'ผลตอบแทนปัจจุบัน'ยอดเยี่ยม'
  3. จากนั้นแทนที่จะหยุดคำสั่งทั้งหมดและส่งกลับคำว่า 'ยอดเยี่ยม' มันยังคงประเมินคำสั่งถัดไป
  4. คำสั่งถัดไปจะกลายเป็น'Exceptional' ? 'Horrible' : 'Average'สิ่งที่ส่งคืน 'Horrible' เนื่องจาก 'พิเศษ' เป็นความจริง

จากเอกสาร: http://php.net/manual/en/language.operators.comparison.php

ขอแนะนำให้คุณหลีกเลี่ยงนิพจน์ประกอบ "ซ้อน" พฤติกรรมของ PHP เมื่อใช้ตัวดำเนินการ ternary มากกว่าหนึ่งตัวภายในคำสั่งเดียวนั้นไม่ชัดเจน


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

ฉันคิดว่าคุณอาจไม่ควรใช้ตัวดำเนินการ ternary ใน php พิจารณาตัวอย่างต่อไป:

<?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ตัวแปรอะไรจะมี? (คำใบ้: dos) และจะยังคงเหมือนเดิมแม้ว่า$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ถ้ามันประเมินเป็น true หรือexpression2 เป็นอย่างอื่น

ตัวอย่าง:

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

จะกลับมา

Apples are great!

เนื่องจาก PHP 5.3 คุณสามารถเว้นส่วนตรงกลางของตัวดำเนินการที่เกี่ยวข้องได้ นิพจน์ expr1?: expr3 ส่งกลับ expr1 ถ้า expr1 ประเมินเป็น TRUE และไม่เช่นนั้น expr3

จากคู่มือ PHP

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.