2013-07-31 13 views
39

Jak napisać potrójny operator PHP z częścią elseif?Jak napisać potrójny operator PHP

widzę podstawowe przykłady z częściami if i else z potrójnego operatora PHP tak:

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

Jak mogę uzyskać „elseif” część podobnego do potrójnego operatora?

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

Lepiej byłoby użyć przełącznika, a nawet lepiej, mapy wyszukiwania tablicy. Ternary z definicji to if-then-else. Napisanie trójskładnikowego, aby spróbować zrobić to, co chcesz, byłoby bardzo trudne do odczytania/naśladowania. –

+0

@ cale_b Czy możesz to trochę wyjaśnić? Nadal uczę się PHP i w mojej pracy użyłem tylko instrukcji if-elseif-else, więc nie jestem zaznajomiony z tymi wszystkimi rzeczami. – dinomuharemagic

+0

Podałem przykład poniżej. Jeśli nie zamierzasz korzystać z bazy danych, to rozwiązanie jest czyste i łatwe do zrozumienia. –

Odpowiedz

75

Trójskładnik nie jest dobrym rozwiązaniem, jeśli chcesz. Nie będzie czytelny w twoim kodzie, a dostępnych jest znacznie lepszych rozwiązań.

Dlaczego nie skorzystać z odnośnika tablicy „Mapa” lub „słownik”, tak:

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

echo $vocations[$result->vocation]; 

potrójnego dla tego zastosowania w końcu wygląda tak:

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

Dlaczego to zły? Ponieważ - jako pojedyncza długa linia nie otrzymalibyśmy poprawnych informacji do debugowania, gdyby coś tu poszło nie tak, długość utrudnia odczytanie, a zagnieżdżanie wielu ternariów wydaje się dziwne.

Standardowy Ternary jest proste, łatwe do odczytania i będzie wyglądać następująco:

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

lub

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

potrójny jest naprawdę wygodne/krótsza droga napisać proste oświadczenie if else. Powyższa próba trójargumentowy jest taka sama jak:

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

Jednak trójargumentowy dla złożonej logiki szybko staje się nieczytelny i nie jest już wart zwięzłość.

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

Nawet niektóre uprzejmy formatowanie szerzyć ją na wielu liniach, to nie jest bardzo jasne:

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

+1 dla słownika! Idealny w tej sytuacji! –

+0

Dziękuję. Jest czysty i prosty w konfiguracji. +1! Muszę poczekać 5 minut, aby zaakceptować odpowiedź, więc .. – dinomuharemagic

+2

"Trójskładnik nie jest dobrym rozwiązaniem na to, co chcesz.", Wyjaśnij dlaczego ... (wiem dlaczego, ale odpowiedź potrzebuje tej informacji) – bizzehdee

3

Nie zrobiłbyś tego: jest brudny i trudny do odczytania.

Poszukujesz oświadczenia switch w pierwszym przypadku. Drugi jest w porządku, ale nadal można go przekonwertować na spójność.

Oświadczenia trójprzewodnikowe są bardziej odpowiednie dla wartości logicznych i logiki naprzemiennej.

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

; 

To trochę brzydkie. Powinieneś trzymać się normalnych instrukcji if.

+3

Brzydki, ale czasem przydatny. Oczywiście nie o takiej wielkości. – MightyPork

+2

Czy możesz usunąć tę przestrzeń przed pierwszą strzałką? Nie można edytować mniej niż 6 znaków. –

3

Szczerze mówiąc, operator trójargumentowy by tylko zrobić to gorzej, co proponuję, jeśli czyni prościej jest to, co mają na celu to:

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

a następnie podobny jeden dla swoich powołań

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

z operatorem potrójnego, by skończyć z

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

Które, jak można powiedzieć, tylko jeszcze bardziej skomplikowany, tym więcej można dodać do niego

3

bym zamiast potrójnego IF- instrukcje idą z przełącznikiem. Na przykład:

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

Oprócz wszystkich innych odpowiedzi, możesz użyć switch. Ale wydaje się to trochę długie.

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

Ponieważ byłoby to typowe zadanie, sugerowałbym zawijanie przełącznika/obudowy wewnątrz wywołania funkcji.

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 są zbędne, gdy używasz 'return'. – mpen

4

Jak napisać podstawowym PHP Ternary Operator:

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

Przykład:

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

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

PHP trójskładnikowych operatora posiadającego 'elseif' wepchnięty tam:

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

Ale proszę nie zagnieżdżać operatorów trójskładnikowych za wyjątkiem sztuczek salonowych. To zły zapach kodu.

+0

To odpowiada na oryginalne pytanie, które było słabo zatytułowane. – dreftymac