2013-07-31 3 views
39

Как написать PHP-тернарный оператор с частью elseif?Как написать PHP-тернарный оператор

я вижу основные примеры с if и else частей троичного оператора PHP, как это:

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

Как я получаю «ElseIf» часть, как это в тройном оператора?

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

Вам было бы лучше использовать коммутатор или даже лучшую карту поиска массива. По определению это тройной вариант if-then-else. Писать тройной, чтобы попытаться сделать то, что вы хотите, было бы очень трудно читать/следовать. –

+0

@cale_b Не могли бы вы прояснить это немного? Я все еще изучаю PHP, и в своей работе я использовал только инструкции if-elseif-else, поэтому я не так хорошо знаком со всеми этими вещами. – dinomuharemagic

+0

Я привел пример ниже. Если вы не собираетесь использовать базу данных, это решение будет чистым и понятным. –

ответ

75

Тернар не является хорошим решением для вас. Это не будет читаемо в вашем коде, и есть много лучших решений.

Почему бы не использовать поиск массива «карты» или «словарь», например, так:

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

echo $vocations[$result->vocation]; 

Тернарная для этого приложения будет в конечном итоге выглядит так:

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

Почему это Плохо? Потому что - как одна длинная строка, вы не получите достоверной отладочной информации, если что-то должно было пойти не так, длина затрудняет чтение, плюс вложение нескольких тернариев просто странно.

Стандартная троичной просто, легко читать, и будет выглядеть следующим образом:

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

или

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

Тройная действительно просто удобный/короткий способ написать простой if else заявление. Приведенный выше пример тройной такое же, как:

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

Однако тройной для сложной логики быстро становится нечитаемым, и больше не стоит краткости.

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

Даже с некоторыми внимательными форматирование, чтобы распространить его на несколько строк, это не очень понятно:

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

+1 для словаря! Идеально подходит для этой ситуации! –

+0

Спасибо. Он чист и прост для конфигурации. +1! Я должен подождать 5 минут, чтобы принять ответ, поэтому .. – dinomuharemagic

+2

«Тернар - это не лучшее решение для чего вы хотите». Объясните, почему ... (я знаю, почему, но ответ нуждается в этой информации) – bizzehdee

3

Вы бы этого не сделали: это грязно и трудно читать.

Вы ищете инструкцию switch в первом случае. Второе прекрасно, так как оно все еще может быть преобразовано для консистенции

Тернарные выражения гораздо более подходят для логических значений и чередующейся логики.

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

; 

Это своего рода уродливое. Вы должны придерживаться нормальных заявлений if.

+3

Уродливые, но иногда полезные. Конечно, не для такого размера. – MightyPork

+2

Можете ли вы удалить это пространство перед первой стрелкой? Невозможно редактировать менее 6 символов. –

3

Честно говоря, тройная оператор, только бы это хуже, чем я хотел бы предложить, если сделать это проще, что вы нацелены на это:

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

, а затем аналогичный один для призваний

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

С тройном оператора, вы бы в конечном итоге с

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

Что вы можете сказать, только становится более сложным, чем больше вы добавите к нему

3

Я бы вместо трехкомпонентной If- заявления идут с коммутационным футляром. Например:

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

В дополнение ко всем другим ответам, вы могли бы использовать switch. Но это кажется немного длинным.

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

Поскольку это была бы общая задача, я бы предложил обернуть коммутатор/корпус внутри вызова функции.

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' являются избыточными, когда вы используете 'return'. – mpen

4

Как написать базовый PHP троичной Оператор:

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

Пример:

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

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

PHP-троичный оператор с 'ElseIf' забита там:

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

Но, пожалуйста, не вставляйте тройных операторов, кроме трюков в гостиной. Это плохой запах кода.

+0

Это отвечает на исходный вопрос, который был плохо озаглавлен. – dreftymac

Смежные вопросы