Как написать PHP-тернарный оператор
Как написать 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';
}
?>
Ответы
Ответ 1
Тернар не является хорошим решением для того, что вы хотите. Это не будет читаемым в вашем коде, и есть гораздо лучшие доступные решения.
Почему бы не использовать поиск по массиву "карта" или "словарь", например:
$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")));
Ответ 2
Поскольку это была бы общая задача, я бы предложил обернуть коммутатор/регистр внутри вызова функции.
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);
Ответ 3
echo ($result ->vocation == 1) ? 'Sorcerer'
: ($result->vocation == 2) ? 'Druid'
: ($result->vocation == 3) ? 'Paladin'
....
;
Его вид уродливый. Вы должны придерживаться нормальных операторов if
.
Ответ 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
Но, пожалуйста, не гнездайте тернарные операторы, кроме трюков в гостиной. Это плохой запах кода.
Ответ 5
Ты бы не стал: его грязный и трудно читаемый.
Вы ищете инструкцию switch
в первом случае. Второе прекрасно, так как оно все еще может быть преобразовано для согласованности
Тернарные утверждения гораздо более подходят для логических значений и чередующейся логики.
Ответ 6
Честно говоря, тернарный оператор только ухудшил бы это, что я бы предложил, если упростить это то, на что вы нацелены:
$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")));
Что, как вы можете сказать, только усложняется, чем больше вы добавляете к нему
Ответ 7
Я бы предпочел бы не тройные 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;
}
Ответ 8
В дополнение ко всем другим ответам вы можете использовать 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;
}
Ответ 9
Вы также можете сделать:
"yes" ?: "no" // Assuming that yes is a variable that can be false.
Вместо:
echo (true) ? "yes" : "no";