28.12.2017   241
Операторы break и continue для работы с циклами в PHP

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

Очень часто при работе с циклами требуется пропустить итерацию из-за каких-то условий, и перейти к следующей. Кроме того, порой и вовсе нужно прервать цикл ещё до того, как он должен был завершиться. Для этого используются специальные операторы – 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, нам не нужны. Значит они для нас должны иметь второстепенное значение. И в цикле мы просто отсекаем лишнее, а затем идёт основной алгоритм – вывод того, что нам нужно.

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

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

Если этот урок был вам полезен, расскажите об этом курсе своим знакомым или поделитесь на него ссылкой в социальных сетях. Также, если вы хотите помочь проекту материально – вы можете сделать это с помощью краудфандинговой платформы Patreon – так вы внесёте неоценимый вклад в развитие проекта. А данный урок вышел при поддержке человека с ником NicoBurno. Спасибо тебе!

Домашнее задание
Для просмотра нужно войти на сайт.
Или получить доступ прямо сейчас:


Нажимая эту кнопку
Вы принимаете политику конфиденциальности

КОММЕНТАРИИ

 SBTesla 2018-01-04 12:48:59
+1
<?php
function hasInArray(array $array , int $num )
{
    foreach ($array as $item) {
        if ($item === $num) {
           return true;
        }
    }

    return false;
}
Ответить
  •  ivashkevich 2018-01-04 14:32:53
    0

    Читайте задание внимательно, пожалуйста. Сказано написать функцию. Как у нас определяются функции? С помощью слова function. В вашем решении я этого не вижу.

    Ответить
     ivashkevich 2018-01-08 13:04:03
    0

    Теперь всё верно, отлично! Что со вторым заданием?

    Ответить
 Dasgonder 2018-01-08 14:39:50
+1
second:
function valueCount ($array, $value) {
    $count = array_count_values($array);
    if (array_key_exists($value, $count)) {
        echo "{$count[$value]} values has found in array";
    } else {
        echo "Value not found";
    }
}

$exampleArr = [1, 2, 1, 3];

valueCount ($exampleArr, 1);
Ответить
  •  ivashkevich 2018-01-09 19:40:10
    0

    Коммент для будущих поколений:
    Вариант рабочий, но не самый оптимальный. array_count_values под капотом идет и считает для каждого элемента число совпадений.

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

    Решение работает, повторюсь, и на небольших массивах будет работать довольно быстро. Но если брать массив с миллионом значений, то будет уже очень большой разрыв в производительности.

    Смотрите ниже в комментариях вариант с foreach - он более оптимальный.

    Ответить
 Dasgonder 2018-01-08 15:11:42
0
version 2:
function valueCount ($array, $value) {
    $result = 0;
    $arrKeys = count($array)-1;
    for ($i=0; $i<=$arrKeys; $i++) {
        if ($array[$i] == $value) {
            $result++;
        }
    }
    echo "value found {$result} times";
}

$exampleArr = [1, 2, 1, 3];

valueCount ($exampleArr, 1);
Ответить
  •  ivashkevich 2018-01-09 19:41:18
    0

    Вариант с foreach проще. Смотрите комментарий ниже.

    Ответить
 Dasgonder 2018-01-09 00:57:42
+1
foreach ver:
function valueCount($array, $value) {
    $result = 0;
    foreach($array as $temp) {
        if($temp == $value) {
            $result++;
        }
    }
    echo "value found {$result} times";
}

$exampleArr = [1, 2, 1, 3];

valueCount($exampleArr, 1);
edited foreach-return ver:
function valueCount($array, $value) {
    $result = 0;
    foreach($array as $item) {
        if($item == $value) {
        $result++;
        }
    }
return $result;
}

$exampleArr = [1, 2, 1, 3];

echo "value found ". valueCount($exampleArr, 1) ." times";
Ответить
 Andreo 2018-01-17 11:35:48
+1
<?php
$arr = [27, 32, 44, 48, 12, 95, 26, 68];
$x = 12;

function searchNumber($x, $arr)
{
    foreach ($arr as $item) {
        if ($item == $x) {
            return true;
            break;
        }
    }

}

var_dump(searchNumber($x, $arr));

$arr = [27, 32, 44, 48, 12, 95, 26, 68, 12, 67, 46, 12];
$x = 12;

function countOfInsides($x, $arr)
{
    $result = 0;
    foreach ($arr as $item) {
        if ($item !== $x) {
            continue;
        } else $result++;
    }
    return $result;
}
echo countOfInsides($x,$arr);
Ответить
  •  ivashkevich 2018-01-18 19:31:51
    0

    По по первой задаче - break после return не имеет смысла.

    По второй:

    1. после else и if всегда идёт блок в фигурных скобках
    2. здесь else не нужен, можно просто написать на новой строке $result++

    В целом всё хорошо и логично, имена функций тоже норм :)

    Ответить
Чтобы написать комментарий нужно войти на сайт.
Или получить доступ прямо сейчас:


Нажимая эту кнопку
Вы принимаете политику конфиденциальности