Цикл foreach оперирует не исходным массивом, а его копией. Это означает, что любые изменения, которые вносятся в массив, не могут быть "видны" из тела цикла. Что позволяет, например, в качестве массива использовать не только переменную, но и результат работы какой-нибудь функции, возвращающей массив (в этом случае функция будет вызвана всего один раз — до начала цикла, а затем работа будет производиться с копией возвращенного значения).
В следующей главе мы рассмотрим ассоциативные массивы и все, что к ним относится, гораздо более подробно.
Конструкция switch-case
Часто вместо нескольких расположенных подряд инструкций if-else целесообразно воспользоваться специальной конструкцией switch-case:
switch(âûðàæåíèå) {
case çíà÷åíèå1: êîìàíäû1; [break;]
case çíà÷åíèå2: êîìàíäû2; [break;]
. . .
case çíà÷åíèåN: êîìàíäûN; [break;]
[default: êîìàíäû_ïî_óìîë÷àíèþ; [break]]
}
Делает она следующее: вычисляет значение выражения (пусть оно равно,
например, V), а затем пытается найти строку, начинающуюся с case V:. Если такая строка обнаружена, выполняются команды, расположенные сразу после нее (причем на все последующие операторы case что_то внимание не обращается, как будто их нет, а код после них остается без изменения). Если же найти такую строку не удалось, выполняются команды после default (когда они заданы).
Обратите внимание на операторы break (которые условно заключены в квадратные скобки, чтобы подчеркнуть их необязательность), добавленные после каждой строки команд, кроме последней (для которой можно было бы тоже указать break, что не имело бы смысла). Если бы не они, то при равенстве V=значение1 сработали бы не только команды1, но и все нижележащие.