Использование if и elseif в конструкции match

Рейтинг: 1Ответов: 4Опубликовано: 14.05.2023

Хотел заменить switch на match, но не пойму, как организовать конструкцию if ... elseif внутри блока match.

В конструкции switch всё просто:

switch ($lesson) {
case 'Русский':
    if ($a=='3') {
        echo 'Удовлетворительно!';
    }
    elseif($a=='4'){
        echo 'Хорошо';
    }
    elseif($a=='5'){
        echo 'Отлично';
    }
    else{
        echo 'Плохо';
    }
    break;        
}

С конструкцией match такое не прокатывает:

match ($lesson){
'Русский' =>[
    if ($a=='3') {
        echo 'Удовлетворительно!';
    }
    elseif($a=='4'){
        echo 'Хорошо';
    }
    elseif($a=='5'){
        echo 'Отлично';
    }
    else{
        echo 'Плохо';
    }
      
  ]
};

Выдаёт ошибку:

Parse error: syntax error, unexpected token "if", expecting "]"

Как в match использовать конструкцию if ... elseif?

Ответы

▲ 1
echo match ($lesson) {
    'Русский' => match ($a) {
        '3' => 'Удовлетворительно!',
        '4' => 'Хорошо',
        '5' => 'Отлично',
        default => 'Плохо',
    },
};
▲ 1

Используйте несколько аргументов в одном match

echo match ([$lesson,$a]) {
    ['Русский','3'] => 'Удовлетворительно!',
    ['Русский','4'] => 'Хорошо',
    ['Русский','5'] => 'Отлично',
    default => 'Плохо',
};
▲ 0

Это не косяк, это так и задумано. Вы пытаетесь использовать конструкцию не по назначению (match выдает соответствия только по выражениям, когда как вы хотите использовать конструкции).

Потом, когда стало можно в массивах писать конструкции? 'value' => [ if() { ... } ] вызовет синтаксическую ошибку. Что, собственно, Вы и видите.

На самом деле Вам тут match не нужен. Конструкция ради конструкции, не иначе. Продолжайте использовать switch - это правильная конструкция для Вашей ситуации.

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

<?php

$lesson = 'Русский';
$a = '3';

echo match ($lesson) {
    'Русский' => call_user_func(function () use ($a) {
            if ($a == 3) {
                return 'Удовлетворительно!';
            } else if ($a == 4){
                return 'Хорошо';
            } else if ($a == 5){
                return 'Отлично';
            } else {
                return 'Плохо';
            }
        })
};
▲ 0
match ($lesson){
'Русский' => function {
    if ($a == '3') {
        echo 'Удовлетворительно!';
    } elseif ($a == '4'){
        echo 'Хорошо';
    } elseif ($a == '5'){
        echo 'Отлично';
    } else {
        echo 'Плохо';
    }  
  }
};