Làm cách nào để tôi sử dụng toán tử ternary (? :) Trong PHP như một cách viết tắt cho tên nếu / khác khác?


118

Dựa trên các ví dụ từ trang này , tôi có các mẫu mã làm việc và không hoạt động bên dưới.

Mã làm việc sử dụng ifcâu lệnh:

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

Mã không hoạt động bằng cách sử dụng toán tử ternary:

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

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

CẬP NHẬT
Sau mẹo của Brian, tôi thấy rằng tiếng vang $testđầu ra cho kết quả mong đợi. Sau đây hoạt động như một nét duyên dáng!

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

4
Có vẻ đúng. Bạn đã thử lặp lại $ test;?
Brian Fisher

Câu hỏi của bạn đang đánh lừa một số tình nguyện viên và các nhà nghiên cứu bởi vì bạn không viết một bài tập bằng cách sử dụng một biểu thức viết tắt tốc ký (không có "Toán tử Elvis") - bạn đang viết một biểu thức tạm thời dài tay. Sự khác biệt là bạn đang khai báo cả hai giá trị được trả về tùy thuộc vào đánh giá. Trong một đánh giá tốc ký, nếu giá trị đầu vào là "trung thực", nó được trả về; nếu đó là "falsey" thì giá trị dự phòng được trả về (đây là giá trị được khai báo sau Toán tử Elvis). Ngoài ra còn có một triển khai kém đáng chú ý của Nhà khai thác hợp nhất Null ở đây.
mickmackusa

Câu trả lời:


234

Các

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

cú pháp không phải là toán tử "tốc ký nếu" ( ?được gọi là toán tử có điều kiện) bởi vì bạn không thể thực thi mã theo cách tương tự như khi bạn đã làm:

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

Trong ví dụ của bạn, bạn đang thực hiện echocâu lệnh khi $addresskhông trống. Bạn không thể làm điều này theo cách tương tự với toán tử có điều kiện. Tuy nhiên, những gì bạn có thể làm là echokết quả của toán tử có điều kiện:

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

và điều này sẽ hiển thị "Đường vắng!" nếu nó trống, nếu không nó sẽ hiển thị địa chỉ street2.


Đó là sự khác biệt giữa tuyên bố và biểu hiện
pmiranda

2
tốc ký lại là gì? condition ?: falseđánh giá conditionnếu nó đúng?
oldboy

43

7+ PHP

Kể từ PHP 7, tác vụ này có thể được thực hiện đơn giản bằng cách sử dụng toán tử kết hợp Null như thế này:

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


3
Chỉ cần FYI, nếu $address['street2']là một chuỗi trống. Nó sẽ chấp nhận nó và sẽ không trở lại 'Empty'. isset() != empty(). Điều này sẽ chỉ hoạt động nếu giá trị lànull
AFwcxx

Vâng, tôi chỉ cung cấp một ví dụ. Nhưng tôi đã sửa đổi mã. Cảm ơn !
Rabin Lama Dong

2
Đầu ra là gì nếu $address['street2']không trống?
AliN11

Nếu $ address ['street2'] không trống, nó sẽ xuất ra một số dạng của true true. Hình thức thông thường ở trên giống như: echo $address['street2'] ?? 'Empty';tuy nhiên như đã đề cập, đó là toán tử kết hợp null null nên nó chỉ kiểm tra null và không rỗng. Đây là vì ?? Có hiệu quả là một tốc ký cho ngay bây giờ ().
Brian C

1
Đăng nhập chỉ để downvote câu trả lời này. Điều này không làm gì ở tất cả những gì được quảng cáo.
TKoL

28

Tuyên bố đúng / sai cơ bản

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

Thông điệp chào mừng có điều kiện

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

Tin nhắn mục có điều kiện

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

ref: https://davidwalsh.name/php-ternary-examples


2
bạn đã nhận được nó từ trang web tay ngắn và thậm chí không tham khảo nó
Richard

1
@ Richard tài liệu tham khảo thêm
Arun Yokesh

Là nó ? Trong ngữ cảnh của StackOverflow, nó luôn luôn là một dòng mỏng, ý tôi là Q đã yêu cầu một cái gì đó, không thể tự mình tìm thấy nó và sau đó ai đó đã cung cấp nội dung này. Có phải là không công bằng khi sao chép nội dung hiện có nếu nó giúp và tăng thêm giá trị cho Q / A này? Tôi nghĩ rằng câu trả lời trên StackOverflow không phải là "nội dung của riêng bạn" ... hmmm
Sliq

Ví dụ đầu tiên là không chính xác. Là )thất lạc. Nó nên đi trước ?. Tuyên bố đầy đủ phải là$is_admin = ($user['permissions'] == 'admin') ? true : false;
1934286

12

Toán tử ternary chỉ là một tốc ký cho khối if và if. Mã làm việc của bạn không có điều kiện khác, vì vậy không phù hợp cho việc này.

Ví dụ sau sẽ hoạt động:

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

6

Đó là toán tử Ternary hay còn gọi là toán tử Elvis (google nó: P) mà bạn đang tìm kiếm.

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

Nó trả về giá trị của biến hoặc mặc định nếu biến trống.


@ Cấu trúc Tôi không thể không đồng ý với những gì bạn nói, nhưng việc này sẽ mang lại cho bạn kết quả propper và đó là một thuật ngữ dễ nhắc hơn
Bàn phím ninja

4

Lưu ý rằng khi sử dụng các toán tử điều kiện lồng nhau, bạn có thể muốn sử dụng dấu ngoặc đơn để tránh các vấn đề có thể xảy ra!

Có vẻ như PHP không hoạt động giống như ít nhất là Javascript hoặc 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');

Mã giống nhau trong Javascript và C # trả về "Đặc biệt" trong cả hai trường hợp.

Trong trường hợp thứ 2, những gì PHP làm là (hoặc ít nhất đó là những gì tôi hiểu):

  1. $score > 10? Đúng
  2. $age > 10? không, vì vậy, hiện tại $age > 10 ? 'Average' : 'Exceptional'trả về 'Đặc biệt'
  3. sau đó, thay vì chỉ dừng toàn bộ tuyên bố và trả về 'Đặc biệt', nó tiếp tục đánh giá tuyên bố tiếp theo
  4. tuyên bố tiếp theo sẽ 'Exceptional' ? 'Horrible' : 'Average'trả về 'Khủng khiếp', vì 'Đặc biệt' là sự thật

Từ tài liệu: http://php.net/manual/en/lingu.operators.comparison.php

Chúng tôi khuyên bạn nên tránh "xếp chồng" các biểu thức ternary. Hành vi của PHP khi sử dụng nhiều toán tử ternary trong một câu lệnh là không rõ ràng.


3

Cách nhanh và ngắn:

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

Dưới đây là một số ví dụ thú vị, với một hoặc nhiều điều kiện khác nhau.

$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

Thông điệp chào mừng có điều kiện

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

Viết tắt PHP lồng nhau

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

2

Bạn có thể làm điều này thậm chí ngắn hơn bằng cách thay thế echobằng<?= code ?>

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

Điều này hữu ích đặc biệt khi bạn muốn xác định, bên trong thanh điều hướng, liệu tùy chọn menu có được hiển thị như đã truy cập (đã nhấp) hay không:

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


Có phải () là cần thiết trong phương thức <? =?> Đó không?
lọn tóc

0

Tôi nghĩ rằng bạn đã sử dụng dấu ngoặc sai cách. Thử cái này:

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

Tôi nghĩ rằng nó nên hoạt động, bạn cũng có thể sử dụng:

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

0

Tôi nghĩ có lẽ bạn không nên sử dụng toán tử ternary trong php. Xem xét ví dụ tiếp theo:

<?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);

Bạn nghĩ thế nào, $abiến nào sẽ chứa? (gợi ý: dos) Và nó sẽ giữ nguyên ngay cả khi $foobiến sẽ được gán cho 2.

Để làm cho mọi thứ tốt hơn, bạn nên từ chối sử dụng toán tử này hoặc bao quanh phần bên phải bằng niềng răng theo cách sau:

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

0

Toán tử Ternary về cơ bản là tốc ký cho câu lệnh if / other. Chúng ta có thể sử dụng để giảm một vài dòng mã và tăng khả năng đọc.

Mã của bạn trông sạch hơn đối với tôi. Nhưng chúng ta có thể thêm cách sạch hơn như sau-

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

Cách khác-

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

Lưu ý- Tôi đã thêm dấu ngoặc vào toàn bộ biểu thức để làm cho nó sạch hơn. Tôi thường làm điều này thường để tăng khả năng đọc. Với PHP7, chúng ta có thể sử dụng Null Coalescing Toán tử / php 7 ?? toán tử để tiếp cận tốt hơn. Nhưng yêu cầu của bạn nó không phù hợp.


-1

Ngoài ra còn có một nhà điều hành tốc ký và nó trông như thế này:

(biểu thức1) ?: biểu thức2 sẽ trả về biểu thức1 nếu nó ước tính thành true hoặc biểu thức2 nếu không.

Thí dụ:

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

sẽ trở lại

Apples are great!

Kể từ PHP 5.3, có thể loại bỏ phần giữa của toán tử ternary. Biểu thức expr1 ?: Expr3 trả về expr1 nếu expr1 ước lượng thành TRUE và expr3 nếu không.

Từ sách hướng dẫn PHP

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.