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

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

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

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


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

    return false;
}
ivashkevich

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

ivashkevich

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

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

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

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

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

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

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

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

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

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

По второй:

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

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

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

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

function searchNumbersInArray(array $arr, int $num)

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

function x()
{
    ...
}
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

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

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

echo searchNumbersInArray($arr, 1);
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

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

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

echo searchNumbersInArray($arr, 1);
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
  1. $isFind = false; - должно быть внутри функции.
  2. во второй функции в самом начале стоит определить $count = 0.
  3. для if и else всегда используйте фигурные скобки.
  4. прочитайте домашку ещё раз - функции не должны ничего выводить (никаких echo быть не должно), они должны что-то возвращать (должны быть return). Первая из них должна вернуть true или false, тут сразу можно указать тип возвращаемого значения bool. Вторая функция должна вернуть целое число, тут можно указать тип возвращаемого значения int.
  5. аргументы функций должны иметь тип int и array - это стоит явно указать перед аргументами.
  6. сами алгоритмы правильные, это хорошо, но стоит поработать над замечаниями.
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

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

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

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

Fox-24

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

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

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
  1. Функция должна возвращать булево значение
  2. Функция должна возвращать число

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

Waldemar

Что-то я не увидел в уроке про функции как указать у функции типы возвращаемых значений.

ivashkevich

Действительно, как-то я упустил это. Спасибо =)

Benya
<?php

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

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

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

не работает

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

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

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

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

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

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

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

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

lordbear53@gmail.com
<?php

function search(array $numbers , int $x) :bool //1
{
    foreach ($numbers as $number)
    {
        if($x === $number)
        {
            return true;
            break;
        }
    }
    return false;
}

function CountOfNumbers(array $numbers, int $x) : int //2
{
    $counter = 0;
    foreach ($numbers as $number) {
        if ($x === $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>';
$output = search($arr, $anotherWanted) ? 'Такое число в масиве есть' : 'Такого числа в масиве нету' ;
echo $output;
ivashkevich

После return не имеет смысла делать break - функция завершает свое выполнение.
В остальном всё хорошо =)

demyanovpaul@yandex.ru

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

function searchToArray($arr, int $n)
{
    foreach ($arr as $item) {
        if($item === $n)
            return true;
    }

    return false;
}

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

function searchCountInToNumbersInArray($arr, int $n)
{
    $count = 0;
    foreach ($arr as $item) {
        if($item === $n)
            $count++;
    }

    return $count;
}
ivashkevich

Всё супер!

virtual2018
<?php
function numberInArray(array $arrayNumber, int $number)
{
    $variableFound = FALSE;
    foreach ($arrayNumber as $item) {
        if ($item == $number) {
            $variableFound = TRUE;
            break;
        }
    }
    return $variableFound;
}

$arrayNumber = [1, 3, 12, 5, 6, 7, 34, 22, 0, 25, 4, 34, 2, 1, 4, 5, 100, 1];
$number = 34;
echo numberInArray($arrayNumber, $number) ? "Число $number обнаружено в массиве" : "Число $number не обнаружено в массиве";

function countNumberInArray(array $arrayNumber, int $number)
{
    $count = 0;
    foreach ($arrayNumber as $item) {
        if ($item == $number) {
            $count++;
        }
    }
    return $count;
}

echo '<br>' . " Число $number обнаружено " . countNumberInArray($arrayNumber, $number) . " раз(а) в исходном массиве";
ivashkevich

Не надо false и true капсом) А так - отличная домашка. Можно еще указать типы возвращаемых значений для функций.

Mike

первое задание


<?php

function valueAr($array, $x){
    foreach ($array as $item){
        if ($item === $x) {
           return true; break;
        }
    }
}
$array = [2, 3, 6, 1, 23, 2, 56, 7, 1, 15];
$x = 7;

echo valueAr($array, $x) ? 'число найдено и равно ' . $x : 'число не найдено ';

второе задание

<?php

function valueAr($array, $x){$i=0;
    foreach ($array as $item)
    {
         if ($item === $x)
         {
    $i+=1; continue;
         }
}echo $i;}
$array = [2, 3, 6, 1, 23, 2, 1, 7, 1, 7];
$x = 10;
echo valueAr($array, $x);
ivashkevich
  1. После return уже ничего не выполнится, break не имеет смысла.
  2. Отформатируйте отступы, невозможно читать. Функция должна возвращать, а не выводить. Для чего continue, если итерация уже завершилась?
Bogdan

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

function isArgumentInArray ($array, $value) {
    foreach ($array as $key => $index) {
        if ($array[$key] == $value) {
            return true;
        }
    }
    return false;
}

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

function returnMatches($massive, $value) {
    $matches = 0;

    foreach ($massive as $key => $index) {
        $massive[$key] == $value ? $matches += 1 : ' ';
    }
    return $matches;
}
Bogdan

возникли непонятки с циклом foreach ($massive as $key => $index)
в первом случае я писал условие: foreach ($massive as $key), отработало все хорошо вроде как, а вот во втором случае никак не хотел работать foreach ($massive as $key). в примерах у нас есть выражения без $index, но прогнав цикл через var_dump(), я увидел что в некоторых индексах масива потерялись значения, писало типа Null, хотя там Int.. как так, хз...

Bogdan

разобрался, в коде было 2 функции, помогло - unset($value);))) иногда полезно читать)

ivashkevich

Почему не указаны типы аргументов функций? Перечитайте урок про функции.

По первой задаче:

foreach ($array as $key => $index) {

Индексом называют ключ массива. У вас же $index - это значение, правильнее будет назвать его $value или $item. Кроме того, здесь можно обойтись более простой конструкцией, без ключа:

foreach ($array as $item) {
    if ($item === $value) {
    ...

По второй - тернарный оператор используется неправильно. Он нужен, когда результат его выполнения будет использоваться. Пример:

$x = 4 > 2 ? 1 : 0;

В этом примере результат из правой части будет присвоен $x. В вашем же случае правильнее использовать if.

Популярное за сутки
Сейчас читают
Логические задачи с собеседований