2009-07-16 32 views
5

Tôi muốn đặt biến thành giá trị, nhưng chỉ khi điều kiện là đúng.
Thay vì làm như sau:Toán tử điều kiện chỉ với câu lệnh đúng

if($myarray["foo"]==$bar){ 
    $variablename=$myarray["foo"]; 
} 

này có thể kết thúc được khá lâu nếu tên biến dài, hoặc có lẽ nó liên quan đến mảng, khi nó khá đơn giản những gì tôi muốn làm — đặt một giá trị nếu một điều kiện là đúng.

Tôi muốn sử dụng các nhà điều hành có điều kiện, một cái gì đó như thế này:

$variablename=($myarray["foo"]=="bar")? $myarray["foo"]...... 

Nhưng điều này không thành công vì tôi không muốn biến được thiết lập ở tất cả nếu tuyên bố là sai.

Về cơ bản, những gì tôi đang cố gắng làm là làm ví dụ đầu tiên ngắn hơn. Có lẽ toán tử có điều kiện không phải là cách mặc dù ...

Có ai có bất kỳ đề xuất nào không?

+0

Mẫu mã thứ hai của bạn không thực sự ngắn hơn lần đầu tiên (nếu bạn loại bỏ dấu ngắt dòng và dấu ngoặc đầu tiên). Bạn vẫn tham khảo các mảng hai lần ... chính xác những gì bạn mong đợi để đạt được từ này? –

Trả lời

-1

Đặt biến cho chính nó trong trường hợp sai:

$variablename=($myarray["foo"]=="bar")? $myarray["foo"] : $variablename 
+1

Tại sao downvot? điều này là hoàn toàn hợp lệ – Draemon

+0

dunno, tôi đã nhận một quá cho cùng một mã. – jjnguy

+0

Nó không hợp lệ, có một cơ hội mạnh mẽ sẽ tạo ra một thông báo. –

7

IMO, cách tốt nhất để làm cho mẫu mã của bạn ngắn hơn là:

if($myarray["foo"] == $bar) 
    $variablename = $myarray["foo"]; 

FYI, tên của các nhà điều hành bạn' hỏi lại không phải là "toán tử bậc ba", là the conditional operator.

Vì bạn hỏi, một cách mà bạn thực sự có thể sử dụng toán tử có điều kiện để làm những gì bạn đang hỏi là:

$myarray['foo'] == $bar ? $variablename = $myarray['foo'] : null; 

nhưng đó là hơi khủng khiếp xấu xí và rất unmaintainable.

+3

Tôi nghĩ rằng nó an toàn hơn để luôn luôn sử dụng niềng răng. –

+7

Chỉ muốn chỉ ra, nó thực sự được gọi là toán tử bậc ba http://ca.php.net/ternary#language.operators.comparison.ternary – Evert

+0

Pfaugh. Cho thấy những gì Zend biết. – chaos

1

Quyền của bạn, ternary không phải là cách để đi. Nó có để xử lý nếu và một phần khác của tuyên bố.

Chỉ cần gắn với câu lệnh if thông thường.

if($myarray["foo"]==$bar) $variablename=$myarray["foo"]; 
0

Bạn có thể đặt các biểu hiện ban đầu trong else một phần của hoạt động ternary, nhưng nếu bạn muốn đảm bảo đánh giá duy nhất của biểu thức sau đó bạn sẽ phải sử dụng một biến tạm thời và một tuyên bố if.

7

Nó không được ngắn hơn nhiều so:

if($condition) $var = $value; 
0

ternary không phải là đường đi, mặc dù nó có thể được viết sao cho công trình ternary.

Lý do là: bạn đang cố gắng sử dụng nó theo cách nó không có ý định, điều này sẽ làm cho mã của bạn khó xử cho các nhà phát triển khác để đọc.

3

Bạn có thể làm điều này, nhưng tôi sẽ không vì nó là khá đọc và ngu ngốc:

$myarray["foo"] == $bar ? $variablename = $myarray["foo"] : 0; 

hoặc

$myarray["foo"] == $bar && $variablename = $myarray["foo"]; 
2

Các "vấn đề" bạn có là không thực sự là một vấn đề. Mã ví dụ của bạn rất rõ ràng và có thể bảo trì. Tôi thực sự muốn nói nó như thế.

Bạn có thể tháo niềng răng, nhưng điều đó sẽ có tác động đến khả năng bảo trì.

Cách khác của bạn là tạo hàm set_if_true (mảng hỗn hợp, khóa chuỗi, boolean có điều kiện). Nó ẩn những gì đang thực sự xảy ra nhưng tùy thuộc vào việc thực hiện cụ thể của bạn nó là một lựa chọn tốt. (Ví dụ: một đối tượng kiểu cấu hình, hoặc bộ nhớ đệm backend)

+0

Đồng ý. Tôi sẽ thêm rằng bạn (hoặc những người khác) có thể muốn tham khảo một tiêu chuẩn mã hóa cho bất kỳ dự án nào bạn có thể đang làm việc. Ví dụ, trạng thái drupal "Luôn luôn sử dụng dấu ngoặc nhọn ngay cả trong các tình huống mà chúng là tùy chọn về mặt kỹ thuật. Có chúng làm tăng khả năng đọc và giảm khả năng lỗi logic được đưa vào khi các dòng mới được thêm vào." [ref] (https://drupal.org/coding-standards) – cdmo

0

Đặt != thay vì ==?: thay vì chỉ ?..

$variablename = ($myarray["foo"] != "bar") ?: $myarray["foo"]; 

cũng giống như

if($myarray["foo"] != "bar"){} else { $variablename = $myarray["foo"]; } 

Nó có thể không phải là giải pháp thông minh nhất nhưng nó hoạt động. Tôi thích điều này một lần nữa

if($myarray["foo"] != "bar") {$variablename = $myarray["foo"]}; 
Các vấn đề liên quan