Операторы break и continue в PHP

28.12.2017 в 08:30
17010
+1346

Очень часто при работе с циклами требуется пропустить итерацию из-за каких-то условий, и перейти к следующей. Кроме того, порой и вовсе нужно прервать цикл ещё до того, как он должен был завершиться. Для этого используются специальные операторы – continue (для перехода к следующей итерации) и break (остановка цикла).

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

Пример использования break

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

<?php

$array = [2, 3, 6, 1, 23, 2, 56, 7, 1, 15];
$number = 1;

А теперь давайте напишем простейший цикл, внутри которого мы будем выяснять, есть ли искомое число в массиве, или нет.

<?php

$array = [2, 3, 6, 1, 23, 2, 56, 7, 1, 15];
$number = 1;

$isNumberFound = false;
foreach ($array as $item) {
    echo 'Сравниваем с числом элемент ' . $item . '<br>';
    if ($item === $number) {
        $isNumberFound = true;
    }
}

echo $isNumberFound ? 'Число найдено' : 'Число не найдено';

Перед циклом мы создали переменную $isNumberFound, которая будет хранить информацию о том, найдено ли число в массиве или нет. Изначально она равна false.

Затем мы начинаем идти по массиву и сравнивать каждый его элемент с числом. Если совпадение найдено, то значение переменной $isNumberFound становится равной true, и теперь мы уже знаем, что искомое число в массиве есть.

При этом на каждой итерации перед проверкой мы выводим информацию о том, какое сравнение сейчас производится.

Выполнение скрипта

При этом мы видим, что все элементы массива сравнивались с числом. И мы понимаем, что нам было бы достаточно найти число и на этом завершить работу цикла. С помощью оператора break это сделать проще простого!

<?php

$array = [2, 3, 6, 1, 23, 2, 56, 7, 1, 15];
$number = 1;

$isNumberFound = false;
foreach ($array as $item) {
    echo 'Сравниваем с числом элемент ' . $item . '<br>';
    if ($item === $number) {
        $isNumberFound = true;
        break;
    }
}

echo $isNumberFound ? 'Число найдено' : 'Число не найдено';

Просто останавливаем работу цикла, как только искомое число найдено. При этом мы видим, что скрипт завершился с гораздо меньшим числом действий.

Ход выполнения программы после оптимизации

Таким образом, мы сделали нашу программу более оптимизированной, так как она больше не делает лишних действий. Ещё один пример по теме вы найдёте в домашнем задании.

Пример использования continue

Не менее редко при каких-то условиях требуется перейти к следующей итерации, не доходя до конца текущей. К примеру – мы хотели бы вывести все числа от 1 до 20, за исключением тех, что делятся на 3 без остатка.

Мы могли бы решить эту задачу с помощью условия – если остаток от деления на 3 не равен нулю, то вывести число.

<?php

for ($i = 1; $i <= 20; $i++) {
    if ($i % 3 != 0) {
        echo $i;
        echo ' ';
    }
}

Результат будет следующим:
Числа которые не делятся на 3

Однако, это можно сделать более изящно. А именно – если число делится на 3 без остатка, то просто переходить к следующей итерации и ничего не делать. А внутри тела цикла, уже вне каких-либо условий, выполнять какой-то код.

Выглядеть это будет так.

<?php

for ($i = 1; $i <= 20; $i++) {
    if ($i % 3 === 0) {
        continue;
    }

    echo $i;
    echo ' ';
}

Результат работы этого кода будет таким же, как и в предыдущем случае. Но с точки зрения сложности чтения и понимания, код упростился. Я понимаю, сейчас трудно уловить эту тонкую грань, но подумайте вот о чём. В задании мы говорили о том, чтобы вывести числа, не делящиеся на 3 без остатка. Значит эти числа – первичны. А остальные числа, которые делятся на 3, нам не нужны. Значит они для нас должны иметь второстепенное значение. И в цикле мы просто отсекаем лишнее, а затем идёт основной алгоритм – вывод того, что нам нужно.

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

А сейчас – за домашнее задание.

loader
28.12.2017 в 08:30
17010
+1346
Домашнее задание
  • напишите функцию, принимающую на вход 2 аргумента - массив и какое-либо значение. Функция возвращает true, если переданное значение присутствует в массиве и false - если нет.
  • напишите функцию, принимающую на вход 2 аргумента - массив и какое-либо значение. Функция возвращает число вхождений числа в массив. Например: для массива [1, 2, 1, 3] число вхождений числа "1" будет равно двум.
  • Решите вот эту задачу
  • А теперь вот эту
Комментарии
Этот урок набрал набрал достаточно большое количество комментариев и дальнейшее его комментирование отключено. Если вы хотели убедиться в правильности выполнения ДЗ или у вас возник вопрос по уроку, посмотрите ранее добавленные комментарии, кликнув по кнопке ниже. Скорее всего вы найдете там то, что искали. Если это не помогло - задайте вопрос в чате в телеграме - https://t.me/php_zone
Логические задачи с собеседований