2013-07-31 38 views
39

Làm cách nào để viết toán tử ternary PHP với phần elseif?Cách viết toán tử ternary PHP

tôi xem các ví dụ cơ bản với ifelse phần của các nhà điều hành ternary PHP như thế này:

echo (true) ? "yes" : "no"; //prints yes 
echo (false) ? "yes" : "no"; //prints no 

Làm thế nào để có được "elseif" phần như thế này vào các nhà điều hành ternary?

<?php 
    if($result->vocation == 1){ 
    echo "Sorcerer"; 
    }else if($result->vocation == 2){ 
    echo 'Druid'; 
    }else if($result->vocation == 3){ 
    echo 'Paladin'; 
    }else if($result->vocation == 4){ 
    echo 'Knight'; 
    }else if($result->vocation == 5){ 
    echo 'Master Sorcerer'; 
    }else if($result->vocation == 6){ 
    echo 'Elder Druid'; 
    }else if($result->vocation == 7){ 
    echo 'Royal Paladin'; 
    }else{ 
    echo 'Elite Knight'; 
    } 
?> 
+3

Bạn nên sử dụng nút chuyển hoặc thậm chí tốt hơn là bản đồ tra cứu mảng. Một ternary theo định nghĩa là if-then-else. Viết một thứ ba để thử và làm những gì bạn muốn sẽ rất khó đọc/làm theo. –

+0

@cale_b Bạn có thể làm rõ một chút không? Tôi vẫn đang học PHP và trong công việc của mình, tôi chỉ sử dụng các câu lệnh if-elseif-else, vì vậy tôi không quen thuộc với tất cả những thứ này. – dinomuharemagic

+0

Tôi đã đưa ra một ví dụ bên dưới. Nếu bạn không sử dụng một cơ sở dữ liệu, thì giải pháp này là sạch sẽ và dễ hiểu. –

Trả lời

75

Ternary không phải là giải pháp tốt cho những gì bạn muốn. Nó sẽ không thể đọc được trong mã của bạn, và có nhiều giải pháp tốt hơn có sẵn.

Tại sao không sử dụng một tra cứu mảng "bản đồ" hay "từ điển", như vậy:

$vocations = array(
    1 => "Sorcerer", 
    2 => "Druid", 
    3 => "Paladin", 
    ... 
); 

echo $vocations[$result->vocation]; 

Một ternary cho ứng dụng này sẽ kết thúc như thế này:

echo($result->group_id == 1 ? "Player" : ($result->group_id == 2 ? "Gamemaster" : ($result->group_id == 3 ? "God" : "unknown"))); 

Tại sao điều này xấu? Bởi vì - như một dòng dài, bạn sẽ không nhận được thông tin gỡ lỗi hợp lệ nếu có điều gì đó sai ở đây, độ dài làm cho nó khó đọc, cộng với việc làm tổ nhiều ternaries chỉ cảm thấy kỳ quặc.

Một tiêu chuẩn ternary là đơn giản, dễ đọc, và sẽ trông như thế này:

$value = ($condition) ? 'Truthy Value' : 'Falsey Value'; 

hoặc

echo ($some_condition) ? 'The condition is true!' : 'The condition is false.'; 

Một ternary thực sự chỉ là một/cách thuận tiện ngắn hơn để viết một tuyên bố đơn giản if else. Mô hình thứ ba ở trên giống như:

if ($some_condition) { 
    echo 'The condition is true!'; 
} else { 
    echo 'The condition is false!'; 
} 

Tuy nhiên, một bộ ba cho một logic phức tạp nhanh chóng trở nên khó đọc và không còn giá trị ngắn gọn nữa.

echo($result->group_id == 1 ? "Player" : ($result->group_id == 2 ? "Gamemaster" : ($result->group_id == 3 ? "God" : "unknown"))); 

Ngay cả với một số định dạng chu đáo để truyền bá nó trên nhiều dòng, nó không phải là rất rõ ràng:

echo($result->group_id == 1 
    ? "Player" 
    : ($result->group_id == 2 
     ? "Gamemaster" 
     : ($result->group_id == 3 
      ? "God" 
      : "unknown"))); 
+0

+1 cho từ điển! Hoàn hảo cho tình huống này! –

+0

Cảm ơn bạn. Nó sạch sẽ và đơn giản để cấu hình. +1! Tôi phải đợi 5 phút để chấp nhận câu trả lời, vì vậy .. – dinomuharemagic

+2

"Một Ternary không phải là giải pháp tốt cho những gì bạn muốn.", Giải thích tại sao ... (tôi biết tại sao, nhưng câu trả lời cần thông tin đó) – bizzehdee

3

Bạn sẽ không: nó rất khó đọc và khó đọc.

Bạn đang tìm kiếm câu lệnh switch trong trường hợp đầu tiên. Thứ hai là tốt như nó nhưng vẫn có thể được chuyển đổi cho sự nhất quán

Các câu lệnh ternary phù hợp hơn với các giá trị boolean và logic luân phiên.

7
echo ($result ->vocation == 1) ? 'Sorcerer' 
     : ($result->vocation == 2) ? 'Druid' 
      : ($result->vocation == 3) ? 'Paladin' 
        .... 

; 

Thật tệ. Bạn nên gắn bó với câu lệnh bình thường if.

+3

Xấu xí, nhưng đôi khi hữu ích. Không phải cho một thứ kích thước này, tất nhiên. – MightyPork

+2

Bạn có thể xóa không gian đó trước mũi tên đầu tiên không? Không thể chỉnh sửa ít hơn 6 ký tự. –

3

Thành thật mà nói, một nhà điều hành ternary sẽ chỉ làm cho tồi tệ hơn, những gì tôi sẽ đề nghị nếu làm nó đơn giản hơn là những gì bạn đang nhắm tới là:

$groups = array(1=>"Player", 2=>"Gamemaster", 3=>"God"); 
echo($groups[$result->group_id]); 

và sau đó một cái tương tự cho các ơn gọi của bạn

$vocations = array(
    1=>"Sorcerer", 
    2=>"Druid", 
    3=>"Paladin", 
    4=>"Knight", 
    .... 
); 
echo($vocations[$result->vocation]); 

Với một nhà điều hành ternary, bạn sẽ kết thúc với

echo($result->group_id == 1 ? "Player" : ($result->group_id == 2 ? "Gamemaster" : ($result->group_id == 3 ? "God" : "unknown"))); 

Mà như bạn có thể nói, chỉ trở nên phức tạp hơn bạn càng thêm vào đó

3

Tôi thà hơn if- ternary báo cáo đi với một trường hợp chuyển đổi. Ví dụ:

switch($result->vocation){ 
case 1: 
    echo "Sorcerer"; 
    break; 
case 2: 
    echo "Druid"; 
    break; 
case 3: 
    echo "Paladin"; 
    break; 
case 4: 
    echo "Knight"; 
    break; 
case 5: 
    echo "Master Sorcerer"; 
    break; 
case 6: 
    echo "Elder Druid"; 
    break; 
case 7: 
    echo "Royal Paladin"; 
    break; 
default: 
    echo "Elite Knight"; 
    break; 
} 
2

Ngoài tất cả các câu trả lời khác, bạn có thể sử dụng switch. Nhưng nó có vẻ hơi dài.

switch ($result->vocation) { 
case 1: 
    echo 'Sorcerer'; 
    break; 

case 2: 
    echo 'Druid'; 
    break; 

case 3: 
    echo 'Paladin'; 
    break; 

case 4: 
    echo 'Knight'; 
    break; 

case 5: 
    echo 'Master Sorcerer'; 
    break; 

case 6: 
    echo 'Elder Druid'; 
    break; 

case 7: 
    echo 'Royal Paladin'; 
    break; 

default: 
    echo 'Elite Knight'; 
    break; 
} 
8

Vì đây sẽ là một tác vụ phổ biến, tôi sẽ đề xuất gói chuyển đổi/vỏ bên trong của cuộc gọi chức năng.

function getVocationName($vocation){ 
    switch($vocation){ 
     case 1: return "Sorcerer"; break; 
     case 2: return 'Druid'; break; 
     case 3: return 'Paladin'; break; 
     case 4: return 'Knight'; break; 
     case 5: return 'Master Sorcerer'; break; 
     case 6: return 'Elder Druid'; break; 
     case 7: return 'Royal Paladin'; break; 
     default: return 'Elite Knight'; break; 
    } 
} 

echo getVocationName($result->vocation); 
+19

break 's dư thừa khi bạn đang sử dụng' return'. – mpen

4

Làm thế nào để viết một bản PHP ternary điều hành:

($your_boolean) ? 'This is returned if true' : 'This is returned if false'; 

Ví dụ:

$myboolean = true; 
echo ($myboolean) ? 'foobar' : "penguin"; 
foobar 

echo (!$myboolean) ? 'foobar' : "penguin"; 
penguin 

Một PHP ternary nhà điều hành với một 'elseif' nhồi nhét trong đó:

$chow = 3; 
echo ($chow == 1) ? "one" : ($chow == 2) ? "two" : "three"; 
three 

Nhưng vui lòng không tổ chức các toán tử ba kỳ ngoại trừ thủ đoạn parlor. Đó là một mùi mã xấu.

+0

Câu trả lời cho câu hỏi ban đầu, vốn có tiêu đề kém. – dreftymac

Các vấn đề liên quan