Подтвердить что ты не робот

Как написать 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';
  }
?>
4b9b3361

Ответ 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";