else if

Функция getTypeOfSentence из предыдущего урока различает только вопросительные и обычные предложения. Давайте попробуем добавить поддержку восклицательных предложений:

<?php

function getTypeOfSentence($sentence)
{
    $lastChar = $sentence[-1];

    if ($lastChar === '?') {
        $sentenceType = 'question';
    }

    if ($lastChar === '!') {
        $sentenceType = 'exclamation';
    } else {
        $sentenceType = 'normal';
    }

    return "Sentence is {$sentenceType}";
}

getTypeOfSentence('Who?'); // => 'Sentence is question'
getTypeOfSentence('No');   // => 'Sentence is normal'
getTypeOfSentence('No!');  // => 'Sentence is exclamation'

Мы добавили еще одну проверку (“exclamation” переводится «восклицание»). Технически функция работает, но с точки зрения семантики есть проблемы.

  • Проверка на наличие восклицательного знака происходит в любом случае, даже если уже был обнаружен вопросительный знак.
  • Ветка else описана именно для второго условия, но не для первого.

Правильнее будет воспользоваться ещё одной возможностью условной конструкции:

<?php

function getTypeOfSentence($sentence)
{
    $lastChar = $sentence[-1];

    if ($lastChar === '?') {
        $sentenceType = 'question';
    } elseif ($lastChar === '!') {
        $sentenceType = 'exclamation';
    } else {
        $sentenceType = 'normal';
    }

    return "Sentence is {$sentenceType}";
}

getTypeOfSentence('Who?'); // => 'Sentence is question'
getTypeOfSentence('No');   // => 'Sentence is normal'
getTypeOfSentence('No!');  // => 'Sentence is exclamation'

Теперь все условия выстроены в единую конструкцию. elseif — это «если не выполнено предыдущее условие, но выполнено текущее». Получается такая схема:

  • если последний символ ?, то 'question'
  • иначе, если последний символ !, то 'exclamation'
  • иначе 'normal'

Выполнится только один из блоков кода, относящихся ко всей конструкции if.

Задание

На электронной карте Вестероса, которую реализовал Сэм, союзники Старков отображены зеленым кружком, враги — красным, а нейтральные семьи — серым.

Напишите для Сэма функцию whoIsThisHouseToStarks, которая принимает на вход фамилию семьи и возвращает одно из трех значений: 'friend', 'enemy', 'neutral'.

Правила определения:

  • Друзья ('friend'): ‘Karstark’, ‘Tully’
  • Враги ('enemy'): ‘Lannister’, ‘Frey’
  • Любые другие семьи считаются нейтральными

Примеры вызова:

whoIsThisHouseToStarks('Karstark'); // => 'friend'
whoIsThisHouseToStarks('Frey');     // => 'enemy'
whoIsThisHouseToStarks('Joar');     // => 'neutral'
whoIsThisHouseToStarks('Ivanov');   // => 'neutral'

Определения

  • else if — способ задать несколько альтернативных условий


Нашли ошибку? Есть что добавить? Пулреквесты приветствуютсяhttps://github.com/hexlet-basics

Упражнение доступно только авторизованным пользователям.

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