создание и продвижение сайта (вбиваю в ТОП-10, как гвозди)Настройка и сопровождение платной рекламы яндекс.директ

Урок 3. Конструкции if-else, switch-case в PHP

Содержание

Теория

Конструкция if-else

Для того, чтобы напрограммировать что-нибудь полезное, 1 переменных далеко не достаточно. Нам нужен механизм, который позволит выполнять определенный код в зависимости от каких-либо условий.

Т.е. нам нужно иметь возможность спросить у PHP 'Если'.

Например так: если эта переменная <0, то вывести 'отрицательно', иначе (т.е. если она > 0) вывести 'положительно'.

В PHP для таких вопросов предназначена конструкция if, которая позволяет выполнять определенный код при выполнении какого-либо условия:

<?

if(логическое выражение){Этот код выполниться, если логическое выражение верно (т.е. равно true)}

else{Этот код выполнится, если логическое выражение неверно (т.е. равно false)}

?>

Обратите внимание на то, что блок else не обязателен.

Логическое выражение представляет собой тот самый вопрос, который мы хотим задать PHP. Например, чтобы спросить 'переменная $a > 0' мы напишем так: $a>0.

Примеры работы:

<?

$a=3;//Если переменная $a>0, то выведите 'верно', иначе (если < или =0) выведите 'неверно'

if($a>0){echo'Верно!';}else{echo'Неверно!';}//выведет 'Верно!'

?>

<?

$a=-3;//Если переменная $a> или = 0, то выведите 'верно', иначе (если <0) выведите 'неверно'

if($a>=0){echo'Верно!';}else{echo'Неверно!';}//выведет 'Неверно!'

?>

Сокращенный синтаксис

В случае, если в фигурный скобках if или else будет только 1 выражение, можно эти фигурные скобки не писать:

<?

//Полный вариант:

if($a==0){echo'Верно!';}else{echo'Неверно!';}

//Уберем скобки после if:

if($a==0)echo'Верно!';else{echo'Неверно!';}

//Уберем скобки после else:

if($a==0){echo'Верно!';}else echo'Неверно!';

//Уберем скобки и после if, и после else (обратите внимание на точку с запятой - она осталась):

if($a==0)echo'Верно!';else echo'Неверно!'

?>

Равенство по значению и типу

Для того, чтобы сравнить на равенство следует использовать оператор двойное равно ==, а не одиночное =, как можно было подумать.

Почему так? Потому что одиночное равно зарезервировано за присваиванием. Смотрите пример:

<?

$a=0;//Если переменная $a=0, то выведите 'верно', иначе (если не =0) выведите 'неверно'

if($a==0)echo'Верно!';else echo'Неверно!'//выведет 'Верно!'

?>

А следующий пример работать будет не так, как мы думаем:

<?

$a=0;//Мы думаем оно работает так: если переменная $a=0, то выведите 'верно', иначе (если не = 0) выведите 'неверно'. На самом деле оно работает так: переменной $a присвоить 1, если удалось присвоить - то выведите 'верно', иначе (если не удалось присвоить) выведите 'неверно'.

if($a=1)echo'Верно!';else echo'Неверно!'//всегда будет выводить 'Верно!'

?>

Кроме оператора == существует еще и оператор ===. Их различие в том, что === сравнивает не только по значению, но и по типу, а == сравнивает только по значению.

Чтобы полностью разобраться в этом, внимательно изучите примеры:

<?

$a='0';//переменная $a представляет собой строку, а не число 0

if($a==0)echo'Верно!';else echo'Неверно!'//Выведет 'Верно!', так как проверяется только значение, но не тип. Поэтому '0' равен 0.

?>

<?

$a='0';//переменная $a представляет собой строку, а не число 0

if($a===0)echo'Верно!';else echo'Неверно!'//Выведет 'Неверно!', так как строка '0' не = числу 0 при сравнении по типу.

?>

Не равно

Для того, чтобы спросить 'не равно', существует операторы != и !==. 1-й игнорирует различие в типах, а 2-й - нет.

<?

$a=0;//Если переменная $a не =0, то выведите 'верно', иначе (если не =0) выведите 'неверно'

if($a!=0)echo'Верно!';else echo'Неверно!';//выведет 'Верно!', так как $a равно 0

?>

<?

$a=1;//Если переменная $a не =0, то выведите 'верно', иначе (если не =0) выведите 'неверно'

if($a!=0)echo'Верно!';else echo'Неверно!';//выведет 'Неверно!', так как $a равно 0

?>

<?

$a='0';//Если переменная $a не =0, то выведите 'верно', иначе (если не =0) выведите 'неверно'

if($a!=0)echo'Верно!';else echo'Неверно!'//Выведет 'Неверно!', так как $a равно '0', а различие в типах игнорируется.

?>

<?

$a='0';//Если переменная $a не =0, то выведите 'верно', иначе (если не =0) выведите 'неверно'

if($a!==0)echo'Верно!';else echo'Неверно!'//Выведет 'Верно!', так как $a равно '0', а это не равно 0 при сравнении по типу.

?>

Все операции сравнения

Возможные операции сравнения, которые можно использовать внутри if:

$a==$b $a равно $b

$a===$b $a равно $b и они одинаковы по типу

$a!=$b $a не равно $b

$a!==$b $a не равно $b или $a равно $b, но они разные по типу

$a<$b $a<$b

$a>$b $a>$b

$a<=$b $a < или равно $b

$a>=$b $a> или равно $b

Функция empty

Зачастую в веб-программировании возникает следующая проблема: необходимо проверить переменную на пустоту.

Переменная будет пустая, если она =0, '' (пустой строке), false или null (т.е. не определена ранее).

Проверка на пустоту выполняется с помощью функции empty():

<?

$a=null;//Если $a пустое, то…

if(empty($a))echo'Верно!';else echo'Неверно!'//выведет 'Верно!'

?>

<?

$a=0;//Если $a пустое, то…

if(empty($a))echo'Верно!';else echo'Неверно!'//выведет 'Верно!'

?>

<?

$a='';//Если $a пустое, то…

if(empty($a))echo'Верно!';else echo'Неверно!'//выведет 'Верно!'

?>

<?

$a='hi';//Если $a пустое, то…

if(empty($a))echo'Верно!';else echo'Неверно!'//выведет 'Неверно!', так как $a не пустая

?>

Чаще возникает обратная задача - проверка на то, что переменная является не пустой. Отрицание не можно сделать с помощью оператора '!':

<?

$a=null;//Если $a Непустое, то…

if(!empty($a))echo'Верно!';else echo'Неверно!'//выведет 'Неверно!', так как $a пустое

?>

Функция isset

Аналогом empty является функция isset. Она проверяет существует ли переменная (т.е. то, что она не = null). Смотрите примеры:

<?

$a='hello';//Если $a существует, то…

if(isset($a))echo'Верно!';else echo'Неверно!';//Выведет 'Верно!', так как $a существует.

?>

<?

$a=0;//Если $a существует, то…

if(isset($a))echo'Верно!';else echo'Неверно!'//Выведет 'Верно!', так как $a существует.

?>

<?//Пусть переменную $a вообще не определяли выше в коде (это все равно, что присвоить ей null). Если $a существует, то…

if(isset($a))echo'Верно!';else echo'Неверно!'//выведет 'Неверно!'

?>

Аналогично проверятся на не существование (через !isset):

<?

$a=3;//Если $a не существует то…

if(!isset($a))echo'Верно!';else echo'Неверно!'//Выведет 'Неверно!', так как $a существует.

?>

Несколько условий сразу: or и and

Иногда может быть нужно составить какое-то сложное условие, например, пользователь вводит месяц своего рождения и вам нужно проверить, что введенное число > или равно 1 и < либо равно 12 (так как в году 12 месяцев).

Для этого существуют операторы and (логическое И) и or (логическое ИЛИ).

<?

$a=3;

$b=-3;//Если $a>0 и $b одновременно <0 то…

if($a>0 and $b<0)echo'Верно!';else echo'Неверно!';//выведет 'Верно!'

$a=3;//Если $a> или =1 и < или =12 то…

if($a>=1 and $a<=12)echo'Верно!';else echo'Неверно!';//выведет 'Верно!'

$a=-3;

$b=-3;//Если $a>0 ИЛИ $b <0 - хотя бы 1 из них, то… выведет 'Верно!', так как хотя $a и не > 0, но 1 из условий - $b<0 - выполнится!

if($a>0 or $b<0)echo'Верно!';else echo'Неверно!'

?>

Вместо and можно писать &&, а вместо or - ||.

Работа с логическими переменными

Многие функции PHP в результате своей работы возвращают либо true (истина), либо false (ложь). Эти значения довольно удобны при своей работе, но новичкам бывает довольно сложно понять их.

Представим себе, что переменная $a=true. В таком случае конструкцию if можно записать так:

<?

$a=true;//Если $a равно true, то…

if($a==true)echo'Верно!';else echo'Неверно!'//Выведет 'Верно!', так как $a равно true.

?>

Так как такие сравнения довольно распространены в PHP, то существует специальный прием, облегчающий работу (но не понимание, к сожалению).

Прием такой: конструкцию $a==true можно заменить на более простую: вместо if($a==true) написать if ($a) и она будет работать аналогично.

Следует пользоваться 2-й конструкцией, так как она проще.

<?//Заменим $a==true на более простую: вместо if($a==true) напишем if($a):

$a=true;//Если $a равно true, то…

if($a)echo'Верно!';else echo'Неверно!';//выведет 'Верно!', так как $a равно true

$a=true;//Если $a не true (т.е. false!), то…

if(!$a)echo'Верно!';else echo'Неверно!'//выведет 'Неверно!', так как $a равно true

?>

Также обратите внимание на следующие примеры:

<?//Данное выражение всегда будет выводить 'Верно'

if(true)echo'Верно!';else echo'Неверно!';

//Данное выражение всегда будет выводить 'Неверно'

if(false)echo'Верно!';else echo'Неверно!';

//Данное выражение всегда будет выводить 'Неверно'

if(!true)echo'Верно!';else echo'Неверно!';

//Данное выражение всегда будет выводить 'Верно'

if(!false)echo'Верно!';else echo'Неверно!';

?>

Работа вместе с HTML

PHP устроен таким образом, что его можно использовать в одном файле с HTML. Представьте, что у нас возникает такая задача: если пользователь авторизован - вывести его логин, иначе ссылку на авторизацию. Ее можно решить, смешивая PHP код и HTML код вместе.

Посмотрите примеры:

<?

$a=true;

if($a){//Данный HTML код будет виден на экране только если $a равно true

echo'<p>Здесь выведем какой-то HTML!';

}

?>

Однако, очень часто это может оказаться неудобным, особенно если размеры HTML кода очень большие. Поэтому можно воспользоваться следующим приемом с разрывом PHP:

<?//Пример на работу вместе с HTML

$a=true;

if($a){//Мы оборвали PHP, но HTML-код ниже все-равно будет виден на экране только если $a равно true.

?>

Здесь выведем какой-то HTML!

<?//Здесь мы продолжаем PHP, открыв скобку <? и закрываем фигурную скобку от ифа.

}

?>

Вложенные if

Предположим, нам необходимо спросить у PHP такую вещь: если переменная $a пуста, то вывести 'Введите $a', если не пуста, то проверить - > 0 $a или нет. Если > 0 - то вывести 'Больше 0!', если < - вывести 'Меньше 0'.

1 конструкцией if здесь не обойтись, нужно использовать 2 таким образом, чтобы 1 была внутри другой:

<?

if(empty($a)){//если переменная $a пуста

echo'Введите $a!';

}else{//если переменная $a не пуста

if($a>0){//спрашиваем, > ли 0 переменная $a

echo'Больше 0!';

}else{

echo'Меньше 0!';

}}

?>

Конструкция elseif

Недостатком конструкции предыдущего примера является большое количество фигурных скобок. Поэтому была изобретена специальная конструкция elseif (пишется слитно!), которая представляет собой одновременно и else, и начало вложенного if:

<?//Решение предыдущей задачи через конструкцию elseif

if(empty($a)){

echo'Введите $a!';

}elseif($a>0){//одновременно выполняется else для empty($a) и спрашивается > ли $a 0

echo'Больше 0!';

}else{

echo'Меньше 0!';

}

?>

Можно использовать несколько elseif, но злоупотреблять этим не стоит (лучше будет воспользоваться конструкцией switch-case, о которой ниже).

Несколько if

Пусть у нас есть такая задача: сайт поддерживает 3 языка - русский, английский, немецкий. Переменная $lang может принимать 3 значения - 'ru', 'en' и 'de'. В зависимости от значения переменной $lang следует вывести фразу на одном из языков.

Решение: можно было бы воспользоваться вложенными ифами или elseif. Выглядело бы это примерно так:

<?//Решение задачи через elseif - не самое удачное

if($a=='ru'){//фраза на русском

echo'Русский текст';

}elseif($a=='en'){//фраза на английском

echo'Английский текст';

}elseif($a=='de'){//фраза на немецком

echo'Немецкий текст';

}

?>

Такое решение не слишком красивое - блок else здесь не нужен! Проще всего будет написать не 1 длинный if с несколькими else, а несколько if вообще без else:

<?//Решение задачи через несколько if - оно намного лучше

if($a=='ru'){//фраза на русском

echo'Русский текст';

}

if($a=='en'){//фраза на английском

echo'Английский текст';

}

if($a=='de'){//фраза на немецком

echo'Немецкий текст';

}//В данном коде сработает только 1 из ифов, так как $a может иметь только 1 из значений

?>

Однако, это решение тоже не слишком удобно. Представьте, что у вас будет не 3 языка, а

10 - вам придется написать 10 конструкций if.

Для таких случаев существует конструкция switch-case.

Конструкция switch-case

Конструкция switch-case представляет собой альтернативу if-else, ее рекомендуется использовать в случае множественного выбора (например, 10 различных языков, как в нашей задаче).

Изучите ее синтаксис:

<?

switch($переменная){

case'значение1':

здесь код, который выполнится в случае, если переменная имеет значение1;

break;

case'значение2':

здесь код, который выполнится в случае, если переменная имеет значение2;

break;

case'значение3':

здесь код, который выполнится в случае, если переменная имеет значение3;

break;

default:

этот код выполнится в случае, если переменная не совпала ни с 1 значением;

break;

}

?>

Решим нашу задачу с 3 языками с помощью данной конструкции:

<?

switch($lang) {

case'ru':

echo'Русский текст';

break;

case'en':

echo'Английский текст';

break;

case'de':

echo'Немецкий текст';

break;

default:

echo'Данный язык не поддерживается';

break;

}

?>

Практика

Примеры решения задач

Задача

Если переменная $a=10, то выведите 'Верно', иначе выведите 'Неверно'.

Решение:

<?
$a=10;
if($a==10){
echo'Верно';
}else{
echo'Неверно';
}
?>

Задача

В переменной $min лежит число от 0 до 59. Определите в какую четверть часа попадает это число (в 1-ю, 2-ю, 3-ю или 4-ю).

Решение:

<?
$min=10;
if($min>=0 and$min<=14){
echo'В 1-ю четверть.';
}
if($min<=15 and$min>=30){
echo'Во 2-ю четверть.';
}
if($min<=31 and$min>=45){
echo'В 3-ю четверть.';
}
if($min>=46 and$min<=59){
echo'В 4-ю четверть.';
}
?>

Задача

Переменная $l может принимать 2 значения: 'ru' и 'en'. Если она имеет значение 'ru', то в переменную $a запишем массив дней недели на русском языке, а если имеет значение 'en' - то на английском. Решите задачу через 2 if, через switch-case и через многомерный массив без ифов и switch.

Решение:

Решение через 2 if:

<?
$l='ru';
if($l=='ru'){
$a=['пн','вт','ср','чт','пт','сб','вс'];
}
if($l=='en'){
$a=['mn','ts','wd','th','fr','st','sn'];
}
var_dump($a)
?>

Решение через switch-case:

<?
$l='ru';
switch($l){
case 'ru':
$a=['пн','вт','ср','чт','пт','сб','вс'];
break;
case 'en':
$a=['mn','ts','wd','th','fr','st','sn'];
break;
}
var_dump($a)
?>

Решение через многомерный массив:

<?
$l='ru';
$a=[
'ru'=>['пн','вт','ср','чт','пт','сб','вс'],
'en'=>['mn','ts','wd','th','fr','st','sn'],
];
var_dump($a[$l])
?>

Задачи для решения

Работа с if-else

Если переменная $a=0, то выведите 'Верно', иначе выведите 'Неверно'. Проверьте работу скрипта при $a=1, 0, -3.

Если переменная $a>0, то выведите 'Верно', иначе выведите 'Неверно'. Проверьте работу скрипта при $a=1, 0, -3.

Если переменная $a<0, то выведите 'Верно', иначе выведите 'Неверно'. Проверьте работу скрипта при $a=1, 0, -3.

Если переменная $a> или =0, то выведите 'Верно', иначе выведите 'Неверно'. Проверьте работу скрипта при $a=1, 0, -3.

Если переменная $a< или =0, то выведите 'Верно', иначе выведите 'Неверно'. Проверьте работу скрипта при $a=1, 0, -3.

Если переменная $a не =0, то выведите 'Верно', иначе выведите 'Неверно'. Проверьте работу скрипта при $a=1, 0, -3.

Если переменная $a='test', то выведите 'Верно', иначе выведите 'Неверно'. Проверьте работу скрипта при $a='test', 'тест', 3.

Если переменная $a='1' и по значению и по типу, то выведите 'Верно', иначе выведите 'Неверно'. Проверьте работу скрипта при $a='1', 1, 3.

Работа с empty и isset

Если переменная $a пустая, то выведите 'Верно', иначе выведите 'Неверно'. Проверьте работу скрипта при $a=1, 3, -3, 0, null, true, '', '0'.

Если переменная $a не пустая, то выведите 'Верно', иначе выведите 'Неверно'.

Если переменная $a существует, то выведите 'Верно', иначе выведите 'Неверно'. Проверьте работу скрипта при $a=3 и null.

Если переменная $a не существует, то выведите 'Верно', иначе выведите 'Неверно'.

Работа с логическими переменными

Если переменная $var=true, то выведите 'Верно', иначе выведите 'Неверно'. Проверьте работу скрипта при $var=true, false. Напишите 2 варианта скрипта - с короткой записью и с длинной.

Если переменная $var не =true, то выведите 'Верно', иначе выведите 'Неверно'. Проверьте работу скрипта при $var=true, false. Напишите 2 варианта скрипта - с короткой записью и с длинной.

Работа с OR и AND

Если переменная $a>0 и <5, то выведите 'Верно', иначе выведите 'Неверно'. Проверьте работу скрипта при $a=5, 0, -3, 2.

Если переменная $a=0 или =2, то прибавьте к ней 7, иначе поделите ее на 10. Выведите новое значение переменной на экран. Проверьте работу скрипта при $a=5, 0, -3, 2.

Если переменная $a= или <1, а переменная $b> или =3, то выведите сумму этих переменных, иначе выведите их разность (результат вычитания). Проверьте работу скрипта при $a и $b=1 и 3, 0 и 6, 3 и 5.

Если переменная $a>2 и <11, или переменная $b> или =6 и <14, то выведите 'Верно', в противном случае выведите 'Неверно'.

На switch-case

Переменная $n может принимать 1 из значений: 1, 2, 3 или 4. Если она имеет значение '1', то в переменную $r запишем 'зима', если имеет значение '2' - 'лето' и так далее. Решите задачу через switch-case.

Задачи

В переменной $d лежит какое-то число из интервала от 1 до 31. Определите в какую декаду месяца попадает это число (в 1-ю, 2-ю или 3-ю).

В переменной $month лежит какое-то число из интервала от 1 до 12. Определите в какую пору года попадает этот месяц (зима, лето, весна, осень).

В переменной $y хранится год. Определите, является ли он високосным (в таком году есть 29 февраля). Год будет високосным в 2 случаях: либо он делится на 4, но при этом не делится на 100, либо делится на 400. Так, годы 1700, 1800 и 1900 не являются високосными, т.к. они делятся на 100 и не делятся на 400. Годы 1600 и 2000 - високосные, т.к. они делятся на 400.

Дана строка с символами, например, 'abcde'. Проверьте, что 1-м символом этой строки является буква 'a'. Если это так - выведите 'да', в противном случае выведите 'нет'.

Дана строка с цифрами, например, '12345'. Проверьте, что 1-м символом этой строки является цифра 1, 2 или 3. Если это так - выведите 'да', в противном случае выведите 'нет'.

Дана строка из 3-х цифр. Найдите сумму этих цифр. Т.е. сложите как числа 1-й символ строки, 2-й и 3-й.

Дана строка из 6 цифр. Проверьте, что сумма 1-х 3 цифр равняется сумме 2-х 3 цифр. Если это так - выведите 'да', в противном случае выведите 'нет'.

Содержание

Отвечу на любые вопросы. С уважением, Дмитрий Владимирович.

Ваше письмо×
Free Web Hosting