PHP ternary operator vs switch statement vs if-elseif …, который я должен использовать?

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

Я вижу основные примеры с примерами 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'; } ?> 

Related of "PHP ternary operator vs switch statement vs if-elseif …, который я должен использовать?"

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

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

 $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"))); 

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

 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); 
 echo ($result ->vocation == 1) ? 'Sorcerer' : ($result->vocation == 2) ? 'Druid' : ($result->vocation == 3) ? 'Paladin' .... ; 

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

Как написать базовый 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 

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

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

 $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"))); 

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

Я бы предпочел, если бы трианны были бы, если бы – заявления с коммутационным футляром. Например:

 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; } 

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

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

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

В дополнение ко всем другим ответам вы можете использовать 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; }