Чат веб-разработчиков
Операторы break и continue для работы с циклами в PHP

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

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

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

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

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

Код доступен только после покупки курса PHP для начинающих.

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

Код доступен только после покупки курса PHP для начинающих.

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

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

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

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

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

Код доступен только после покупки курса PHP для начинающих.

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

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

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

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

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

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

Код доступен только после покупки курса PHP для начинающих.

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

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

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

Код доступен только после покупки курса PHP для начинающих.

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

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

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

Читайте также
Комментарии


SBTesla
SBTesla
<?php
function hasInArray(array $array , int $num )
{
    foreach ($array as $item) {
        if ($item === $num) {
           return true;
        }
    }

    return false;
}
ivashkevich
ivashkevich

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

ivashkevich
ivashkevich

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

Dasgonder
Dasgonder
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
ivashkevich

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

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

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

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

Dasgonder
Dasgonder
//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";
ivashkevich
ivashkevich

Вот теперь идеально!)

Andreo
Andreo
<?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
ivashkevich

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

По второй:

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

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

1nSide
1nSide

Так что-ли?

$arr = [];

for ($i = 1; $i <=20; $i++){
    $arr[] = $i;
}

function searchNumbersInArray($arr, $num){

    foreach ($arr as $value){
        if ($value === $num){
            return true;
        }
    }
    return false;
}

echo searchNumbersInArray($arr, $num = 10)? 'число найдено - '. $num : 'число не найдено';
ivashkevich
ivashkevich

Да, всё верно. Привыкайте использовать типы аргументов в функциях:

function searchNumbersInArray(array $arr, int $num)

фигурная скобка для тела функции ставится на новой строке:

function x()
{
    ...
}
1nSide
1nSide

Не совсем понял смысл задачи

$arr = [1,2,1,4];

function searchNumbersInArray($arr, $num){

$number = 0;

    foreach ($arr as $value){
        if ($value === $num){
           $number++;
        }
    }
    return $number;
}

echo searchNumbersInArray($arr, $num = 1);
ivashkevich
ivashkevich

Всё правильно)

Только не нужна вам здесь переменная $num:

echo searchNumbersInArray($arr, 1);
1nSide
1nSide

Так что-ли?

$arr = [1,2,1,4];

function searchNumbersInArray($arr)
{
    $number = 0;

    foreach ($arr as $value){
        if ($value === 1){
           $number++;
        }
    }
    return $number;
}

echo searchNumbersInArray($arr);
ivashkevich
ivashkevich

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

Вот так должно быть в конце:

echo searchNumbersInArray($arr, 1);
SlipKnot
SlipKnot

Домашка №1:

$isFind = false;
function myFunction($i, $array = [])
{
    foreach ($array as $item) {
        echo 'Сравниваем с числом - ' . $item . '<br>';
        if ($item === $i) {
            $isFind = true;
            echo 'Искомое число - ' . $i . ' найдено!<br>';
            break;
        }
    } if ($isFind != true) {
        echo 'Число ' . $i . ' не найдено!';
    }
}

Домашка №2:

function findNum ($i, $arr = [])
{
    foreach ($arr as $value) {
        if ($i == $value) {
            $count += 1;
        }
    }
    if ($count== 0) {
        echo 'Число ' . $i .' не найдено';
    }
    else echo 'Число ' . $i . ' встречается ' . $count . ' раз(а)';
}
ivashkevich
ivashkevich
  1. $isFind = false; - должно быть внутри функции.
  2. во второй функции в самом начале стоит определить $count = 0.
  3. для if и else всегда используйте фигурные скобки.
  4. прочитайте домашку ещё раз - функции не должны ничего выводить (никаких echo быть не должно), они должны что-то возвращать (должны быть return). Первая из них должна вернуть true или false, тут сразу можно указать тип возвращаемого значения bool. Вторая функция должна вернуть целое число, тут можно указать тип возвращаемого значения int.
  5. аргументы функций должны иметь тип int и array - это стоит явно указать перед аргументами.
  6. сами алгоритмы правильные, это хорошо, но стоит поработать над замечаниями.
dom1r
dom1r
<?php
// 1
$array = [1, 2, 0, 4, 0];

function findItem($array, $item) {
    $isNumberFound = false;

    foreach ($array as $value) {
        if ($item == $value) {
            $isNumberFound = true;
            break;
        } else {
            $isNumberFound = false;
        }
    }

    return $isNumberFound;
};

$result = findItem($array, 3);

var_dump($result);
<?php
// 2
$array = [1, 1, 3, 4, 5];

function findMatch ($array, $value) {
    $i = 0;

    foreach ($array as $item) {
        if ($value == $item) {
            $i++;
        }
    }

    return $i;
};

echo findMatch($array, 1);
ivashkevich
ivashkevich

Отлично! Не забывайте про типы аргументов и типы возвращаемых значений.

Fox-24
Fox-24

Спасибо за еще один клевый урок!)

<?php
// Напишите функцию, принимающую на вход 2 аргумента - массив и какое-либо значение. Функция возвращает true,
// если переданное значение присутствует в массиве и false - если нет.

$num = 4;
$array = [2, 6, 4, 7, 3, 6, 8];
$status = false;

function searchNum($array, $num)
{
    foreach ($array as $volume) {
        if ($volume === $num) {

            return true;
        }

    }
    return false;
}

echo var_dump(searchNum($array, $num));

// Напишите функцию, принимающую на вход 2 аргумента - массив и какое-либо значение.
// Функция возвращает число вхождений числа в массив. Например: для массива [1, 2, 1, 3] число вхождений числа "1" будет равно двум.

$num = 2;
$array = [2, 6, 4, 2, 1, 2, 8];

function numberFunc($array, $num)
{
    $i = 0;
    foreach ($array as $volume) {
        if ($volume === $num) {
            $i++;
        }
    }
    return $i;
}

echo numberFunc($array, $num);
ivashkevich
ivashkevich

Тут всё хорошо. Очень быстро осваиваете материал, у Вас отличные способности к программированию!

Fox-24
Fox-24

Большое спасибо!
Я очень стараюсь и все задания делаю без "подсказок" из комментов, так продуктивнее и интереснее =)

sofi.tatarinowa@yandex.ru
sofi.tatarinowa@yandex.ru

2)

<?php
$array = [2, 3, 6, 1, 1, 1, 1, 7, 1, 15];
$number = 1;
function return1 ( $array, $number)
{
    $i = 0;
    foreach ($array as $item) {
        if ($item !== $number) {
            continue;
        } else $i++;
    }
    return $i;
}

echo return1 ($array, $number);
ivashkevich
ivashkevich
  1. Давайте функциям осмысленные имена, что за return1?
  2. Всегда указывайте типы аргументов:
    function getCountInArray(array $array, int $number)
  3. Указывайте тип возвращаемого значения
    function getCountInArray(array $array, int $number): int
  4. Код в блоках if-else ВСЕГДА оборачивайте в фигурные скобки, даже если это одна строчка:
    if ($item !== $number) {
    continue;
    } else {
    $i++;
    }
  5. В вашем случае можно проверить только равенство:
    if ($item === $number) {
    $i++;
    } 

Ну а за то, что код работает - ставлю 5 =)

ArtemijeKA
ArtemijeKA

1.

$arr = [1, 5, 234, 2, 52, 235];
$numb = 3;
function arrAndNumb($arr, $numb) {
    if (in_array($numb, $arr)) {
        return 'Число '.$numb.' есть в массиве!';
    } else {
        return 'Числа '.$numb.' нет в массиве!';
    }
}
echo arrAndNumb($arr, $numb);

2.

$arr = [1, 5, 234, 2, 52, 235, 2];
$numb = 2;
function arrAndNumb($arr, $numb)
{
    $count = 0;
    foreach ($arr as $number) {
        if ($number == $numb) {
            $count++;
        }
    }
    return 'Число ' . $numb . ' встречается '.$count.' раз в массиве!';
}
echo arrAndNumb($arr, $numb);
ivashkevich
ivashkevich
  1. Функция должна возвращать булево значение
  2. Функция должна возвращать число

У аргументов функций должны быть указаны типы! У функций должны быть указаны типы возвращаемых значений. Всё это было в уроке про функции.

Benya
Benya
<?php

function arrayIn(array $array, $x) {
    foreach ($array as $item) {
        if ($x == $item) {
            return true;
        }else {
            return false;
        }
    }
}
ivashkevich
ivashkevich

не пойдет - если передать массив:
1, 3, 5
и число:
3
то вернёт false, несмотря на то, что число в массиве есть

Benya
Benya
function countOfarray(array $array, $x)
{
    $i=0;
    foreach ($array as $item) {
        if ($x == $item) {
            $i++;
        }
        return;
    }
}
$exarrey=[25,35,41,41,77,88,1];

echo "found-".countOfarray($exarrey, 41);
ivashkevich
ivashkevich

не работает

Art
Art
//Вариант с многомерным массивом и рекурсией
$menu = [
    'About',
    'My entry',
    'Services' => [
        'Service 1',
        'Service 2' => [
            'Sub Service 21',
            'Sub service 22',
            'My entry',
            'My entry'
        ]
    ],
    'Goods' => [
        'Goods 1',
        'Goods 2',
        'My entry',
        'My entry',
        'My entry'
    ],
    'Contacts',
    'My entry',
    'My entry'
];

//==================================
function arrayEntries($menu, $entry, $res)
{
    foreach ($menu as $item) {
        if (is_array($item)) {
            $res = arrayEntries($item, $entry, $res);
        } else {
            if ($item === $entry) {
                $res = true;
                break;//небольшая оптимизация
            }
        }
    }
    return $res;
}

//==================================
function countOfArrayEntries($menu, $entry, $res)
{
    foreach ($menu as $item) {
        if (is_array($item)) {
            $res = countOfArrayEntries($item, $entry, $res);
        } else if ($item === $entry) {
            $res++;
        }
    }
    return $res;
}

echo '<br>arrayEntries() = ' . (arrayEntries($menu, 'My entry', false) == true ? 'Entry found' : 'No entries');
echo '<br>countOfArrayEntries() = ' . countOfArrayEntries($menu, 'My entry', 0);
tmv.nika@mail.ru
tmv.nika@mail.ru
function arrayCheck (array $array, int $x): boolean
{
    foreach ($array as $value){
        if ($value == $x) {
            $i = true;
            break;
        }
        else {
            $i = false;
        }
    }
    return $i;
}
echo arrayCheck([3,4,6,8,9,0],11);

Выдает ошибку, не пойму почему...

ivashkevich
ivashkevich

Какую ошибку?

tmv.nika@mail.ru
tmv.nika@mail.ru

( ! ) Fatal error: Uncaught TypeError: Return value of arrayCheck() must be an instance of boolean, boolean returned in C:\openServer\OSPanel\domains\myproject.loc\www\index.php on line 32
( ! ) TypeError: Return value of arrayCheck() must be an instance of boolean, boolean returned in C:\openServer\OSPanel\domains\myproject.loc\www\index.php on line 32

$i = false;
function arrayCheck (array $array, int $x): bool
{
foreach ($array as $value){
if ($value === $x) {
$i = true;
break;
}
else {
$i = false;
}
}
return $i;
}
arrayCheck([3,4,6,8,9,0],0);

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

не работает, а понять почему не могу

ivashkevich
ivashkevich

Потому что нужно писать : bool а не : boolean

tmv.nika@mail.ru
tmv.nika@mail.ru
<?php

function howMuch(array $array, int $x): int
{   $number = 0;
    foreach ($array as $value) {
        if ($value === $x) {
            $number++;
        }
    }
    return $number;
}
ivashkevich
ivashkevich

Хорошо. Но перед циклом стоит явно задать $number = 0

lordbear53@gmail.com
lordbear53@gmail.com
<?php

function search($arr, $AnotherWanted) //1
{
    $IsNumberFound=false;
    foreach ($arr as $number)
    {
        if($AnotherWanted === $number)
        {
            $IsNumberFound = true;
        }
    }
    if($IsNumberFound)
    {
        echo 'Такое число в масиве есть <br>';
    }else{
        echo 'Такого числа в масиве нету<br>';
    }
}

function CountOfNumbers($arr, $wanted) //2
{
    $counter = 0;
    foreach ($arr as $number) {
        if ($wanted === $number) {
            $counter++;
        }
    }
    return $counter;
}
$arr = [1,3,3,2,4,41,4,2,5,1,4,2,1,1,1];
$wanted = 1;
$AnotherWanted = 41;
echo 'Количество таких чисел как ' .$wanted . ' в масиве = ' . CountOfNumbers($arr, $wanted) . '<br>';
echo search($arr, $AnotherWanted);
ivashkevich
ivashkevich

Почему нет типов у аргументов в функциях, как в уроке?
В первой задаче функция должна возвращать булево значение, а не выводить что-то.
Имена переменных должны быть с маленькой буквы.
После $IsNumberFound = true; нужно делать break, так как дальше можно не искать.