Как написать 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'; } ?>
Тернар не является хорошим решением для вас. Это не будет читаемо в вашем коде, и есть много лучших решений.
Почему бы не использовать поиск по массиву «карта» или «словарь», например:
$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; }