Использование if и elseif в конструкции match
Хотел заменить 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?
Ответы (4 шт):
Это не косяк, это так и задумано. Вы пытаетесь использовать конструкцию не по назначению (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 'Плохо';
}
})
};
echo match ($lesson) {
'Русский' => match ($a) {
'3' => 'Удовлетворительно!',
'4' => 'Хорошо',
'5' => 'Отлично',
default => 'Плохо',
},
};
Используйте несколько аргументов в одном match
echo match ([$lesson,$a]) {
['Русский','3'] => 'Удовлетворительно!',
['Русский','4'] => 'Хорошо',
['Русский','5'] => 'Отлично',
default => 'Плохо',
};
match ($lesson){
'Русский' => function {
if ($a == '3') {
echo 'Удовлетворительно!';
} elseif ($a == '4'){
echo 'Хорошо';
} elseif ($a == '5'){
echo 'Отлично';
} else {
echo 'Плохо';
}
}
};