Цикл for в PHP: урок с примерами

Цикл for: работаем с числами

Всем привет! В этом уроке поговорим об еще одном цикле в PHP – for. Он предназначен для случаев, когда нужно работать с числовыми индексами массивов, или же когда нужно осуществлять перебор чисел. Он поначалу кажется более сложным, чем foreach или while, но на самом деле ничего сложного нет.

Выглядит цикл следующим образом:

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

Как мы видим, есть 3 выражения, которые находятся в круглых скобках. Давайте разберем каждый из них.

  • expr1 – это выражение выполняется только один раз перед началом цикла. Здесь обычно происходит определение переменной.
  • expr2 – здесь задаётся условие. Если результат этого выражения – true, то цикл выполнится, иначе – закончится. Например, здесь можно проверить, что переменная меньше какого-либо значения.
  • expr3 – тут указывается действие, которое будет выполняться в конце каждой итерации цикла. Например – переменная увеличивается на единицу.

Пример можно? Да пожалуйста!

Давайте теперь рассмотрим реальный пример:

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

Данный код выведет все числа от 0 до 99.

  1. Итак, перед началом цикла мы определяем переменную $i = 0.
  2. Затем, перед тем как выполнить цикл, мы проверяем, что переменная $i меньше 100. Если это так, то выполнится тело цикла. А именно – выведется текущее значение переменной и выполнится перенос строки.
  3. Следующим шагом будет выполнение третьего выражения – инкремент переменной $i.
  4. Теперь снова будет выполнена проверка условия, что $i < 100. И так далее, пока условие не перестанет выполняться. А если быть точнее – пока $i не станет равной 100. Тут цикл завершит работу.

Есть ещё что-то, что нужно знать?

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

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

Работать такой код будет так же, как и предыдущий вариант. Просто перед началом цикла не будет ничего выполнено.

Можно убрать и третье выражение, которое выполняется после итерации. Перенесем инкремент внутрь тела цикла и результат получится тот же:

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

Более того, могут вообще отсутствовать все аргументы. При отсутствии второго аргумента получится бесконечный цикл:

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

Где это применимо?

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

Давайте рассмотрим несколько примеров.

Найти все чётные числа от 1 до 50 и вывести их

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

Создать массив из 50 случайных значений

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

Посчитать сумму чисел от 1 до 1000

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

Как видите, данные задачи элегантно решаются с использованием цикла for. В следующих уроках мы рассмотрим ещё несколько фишек с циклами и научимся реализовывать более сложные алгоритмы. Не забудьте подписаться, чтобы не пропустить новые уроки. А пока поэкспериментируйте с задачами из домашнего задания.

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


trialex3
trialex3
<?php
for ($x = 1000;$x<100000;$x++) {
    if ($x % 17 == 0) {
        echo "$x, ";
    }
}
?>
ivashkevich
ivashkevich

Хорошо) А что со вторым заданием?

SBTesla
SBTesla
$prevPrev = 0;
$prev = 1;

echo $prevPrev.'<br>';
echo $prev.'<br>'
for ($x = 1; $x <= 100000;) {
    $x        = $prev + $prevPrev;
    $prevPrev = $prev;
    $prev     = $x;

    echo $x . '<br>';
}
ivashkevich
ivashkevich

Хорошее решение, только отступы надо лишние убрать.

humanidis@gmail.com
humanidis@gmail.com

В вышеуказанном варианте есть недоработка - вывод последнего числа фибоначчи (121393) происходит перед его проверкой на условия цикла (<= 100000). Вот мой вариант

<?php
    $arr = [0, 1];
    $prev = 0;

    for ($i = 1; $i <= 100000; ){

        $i += $prev;
        $prev = $i - $prev;

        if ($i <= 100000) {
            $arr [] = $i;
        }
    }
    var_dump($arr);

Если есть вариант, как убрать проверку перед включением числа фибоначчи в массив - подскажите)

ivashkevich
ivashkevich

Добрый день! Спасибо, важное замечание, я и не заметил. Вы нашли настоящий баг =)

Вариант есть, но для его реализации нужно ознакомиться с оператором break из следующего урока.

Лучше будет убрать условие внутри for(...), и оставить его только внутри тела цикла, как у Вас. Только нужно будет проверять, что если текущее получившееся число стало больше верхнего диапазона, то нужно цикл прервать:

    $arr = [0, 1];
    $prev = 0;

    for ($i = 1;;){
        $i += $prev;
        $prev = $i - $prev;

        if ($i > 100000) {
            break;
        }

        $arr [] = $i;
    }
WarLikeLaux
WarLikeLaux

enter image description here

ivashkevich
ivashkevich

Тут всё верно.

WarLikeLaux
WarLikeLaux
<?php
$temp = array(0,1);
echo $temp[0] . ' ' . $temp[1] . ' ';
for ($i = 1; $i < 100000 ; $i++) {
    if ($i == $temp[0] + $temp[1]) {
        $temp[0] = $temp[1];
        $temp[1] = $i;
        echo $i . ' ';
    }
}
ivashkevich
ivashkevich

Вариант рабочий, засчитываю. Но не самый оптимальный - в вашем варианте $i увеличивается на единицу и происходит очень много лишних действий. Вместо этого лучше в $i присваивать сумму двух предыдущих значений. Как здесь.

serb2017
serb2017
<?php
//* числа Фиббоначи

$i1 = 100000;
$arrayF [0] = 0;
$arrayF [1] = 1;
$arrayF [2] = 1;

for ($i = 1; $arrayF [$i] <= $i1; $i++) {
    $arrayF [$i + 1] = $arrayF [$i] + $arrayF[$i - 1];
    echo  'число Фиббоначчи  ' . $i . '=' . $arrayF [$i] . '<br>';
}
ivashkevich
ivashkevich

Отличное решение! Только уберите пробелы между названием массива и [].

И вот эту строку можно убрать:

$arrayF[2] = 1;

P.S. вы можете редактировать свой комментарий.

serb2017
serb2017
<?php
//* Числа кратные m
$n = 1;
$m = 17;
$i = 1000;
$i1 = 1000000;
for (; $i <= $i1; $i += $n) {
    if ($i % $m === 0) {
        $array1 [] = $i;
        $n = $m;
    }
}
foreach ($array1 as $i) {
    echo 'число  ' . $i . 'делится на   ' . $m . '=' . $i / $m;
    echo '<br>';
}
ivashkevich
ivashkevich

Хорошее решение! Исправьте кодстайл как я вам уже говорил и попробуйте дать более осмысленные имена переменным.

Andreo
Andreo
<?php
for ($x = 1000; $x <= 1000000; $x++) {
    if ($x % 17 == 0) {
        echo $x . '<br>';
    }
}

$arr = [0, 1];

for ($i = 0; $fib <= 100000; $i++) {
    $fib = $arr[$i] + $arr[$i + 1];
    $arr[] = $fib;
}
foreach ($arr as $fibon) {
    echo $fibon . '<br>';
}

Чет я по ходу намудрил... Зато сам пришел к этому, не глядя в комментарии других пользователей )
Только почему-то у меня выводится последнее лишнее число...

Добавил проверку в обработку массива ))

$arr = [0, 1];

for ($i = 0; $fib <= 100000; $i++) {
    $fib = $arr[$i] + $arr[$i + 1];
    $arr[] = $fib;
}
foreach ($arr as $fibon) {
    if ($fibon <= 100000) {
        echo $fibon . '<br>';
    }
}
ivashkevich
ivashkevich

Интересное решение, засчитываю) Но советую посмотреть в интернете другие реализации. Мне больше всего нравится вот это решение.

Lungren
Lungren
<?php
    for($i=1000; $i<1000000; $i++){
    if($i%17===0){
        echo $i;
        echo '';
        echo '<br/>';
    }
    }
?>
ivashkevich
ivashkevich

Стоит учитывать, что верхняя граница тоже может подходить под условия. Тогда правильнее будет условие

$i <= 1000000
DmitryGavrilov
DmitryGavrilov
<?php

//найти числа фибоначи меньше 10000
//Числа Фибоначчи – это последовательность чисел, в которой первые два числа равны 0 и 1,
// а каждое последующее число равно сумме двух предыдущих чисел.

$fistCount = 0;
$secondCount = 1;

//выводим на экран 1 и 0, для того чтобы была наглядно видна последовательность
echo $fistCount . '<br>';
echo $secondCount . '<br>';
//цикл с условием начала от 1, но не больше 10000
for ($sumOfCount = 1; $sumOfCount <= 10000;) {

    // считаем сумму чисел яч1
    $sumOfCount = $fistCount + $secondCount;
    // второе значение становится первым яч2
    $fistCount = $secondCount;
    // сумма чисел становится вторым значением яч3
    $secondCount = $sumOfCount;

    //вывод результата из цикла
    echo $sumOfCount;
    echo '<br>';
}

?>
ivashkevich
ivashkevich

Отлично) Только стоит переименовать переменные. "Count" - это число чего-то. Просто "число" - это "number".

DmitryGavrilov
DmitryGavrilov

Как скажете Сенсей!

DmitryGavrilov
DmitryGavrilov
<?php
//попробуем вывести все числа от 1000 до 1000000 делимые на 17 без остатка
//в цикле задаем начальную переменную со значением 1000, второе условаие окончание цикла 1кк, и инкремент по
for ($i = 1000; $i < 1000000; $i++) {
    //проверочное условние - если переменная делится без остатка на 17 - то выводим переменную
    if ($i % 17 == 0) {
        echo $i;
        echo '<br>';
    }
}
?>
ivashkevich
ivashkevich

Лучше вот так, с проверкой типа:

$i % 17 === 0

А так - отличное ДЗ

DmitryGavrilov
DmitryGavrilov

Понял, благодарю! А почему тождественная проверка лучше?

ivashkevich
ivashkevich

Так больше уверенности в том, что сравниваются одинаковые данные. Со временем поймёте)

1nSide
1nSide

1 задача

for($i = 1000; $i <= 1000000; $i++){
    if ($i % 17 === 0){
        echo $i;
        echo ' ';
    }
}
andropij
andropij
<?php
$Fibonachi = 1;
$sim = 0;
for ($i = 0; $i < 100000; $i++) {
    if ($Fibonachi == $i) {
        $Fibonachi += $i;
    }
}
echo $Fibonachi;
ivashkevich
ivashkevich

Не работает

andropij
andropij
<?php
$a = 100000;
$fibonachi = 1;
$array = [0, 1];
for ($i = 1; ; $i++) {
    if ($fibonachi > $a) {
        break;
    }
    $fibonachi += $array[$i - 1];
    array_push($array, $fibonachi);
}
unset($array[$i]);
var_dump($array);

Понял свои ошибки. Думал никто не ответит, но хорошо, что я ошибался. Спасибо, что поддерживаете проект.

ivashkevich
ivashkevich

Немного неправильно, должно начинаться на 0, 1, 1, 2... У Вас 0, 1, 2...
А проект жив)

Fox-24
Fox-24

Спасибо за урок!

<?php

// Найдите числа от 1000 до 1000000, которые делятся на 17 без остатка.

$minnum = 1000;
$maxnum = 1000000;

for (;$minnum <= $maxnum;$minnum++) {
    if ($minnum % 17 === 0) {
        echo $minnum . '</br>';
    }
}

/* Найдите числа Фибоначчи меньше 100000. Числа Фибоначчи – это последовательность чисел, в которой первые два числа равны 0 и 1,
а каждое последующее число равно сумме двух предыдущих чисел.
Должно получиться: 0, 1, 1, 2, 3, 5, 8 ... */

$num2 = 1;      //Задаем второе число
for ($num1 = 0;$num1 <= 100000;$num1 += $num2) {  // Задамем первое число, условивие при котором отобразяться все числа фибоначи меньше 100000 и выполняем первое сложение
    $num2 += $num1;                               // Второе сложение предыдущего чисоа с текущим

    echo $num1. ',' . $num2 . ',';                //Выводим оба числа в цикле.
}
ivashkevich
ivashkevich

Хорошо, но второй пример какой-то сложный. Непонятна логика того, что вычисляется именно сумма двух предыдущих. По идее для этого должна быть использована одна переменная, и ещё две переменные для хранения двух предыдущих чисел. Здесь же это не очевидно, хоть и работает.

Dilik
Dilik
for ($i = 1000; $i <= 100000; $i++) {
    if ($i % 17 == 0) {
        echo $i . '<br>';
    }
}
Dilik
Dilik
<?php
$arr = [0, 1];
$a = 0;
$b = 1;
for ($i = 0; $i <= 100; $i++) {
    if ($i === $a + $b) {
        $a = $b;
        $b = $i;
        $arr[] = $i;
    }
}
var_dump($arr);
ivashkevich
ivashkevich

Ок! Но можно быстрее, мы с Вами уже это обсуждали =)

ArtemijeKA
ArtemijeKA
  1.    for ($i = 1000; $i <= 1000000; $i++) {
            if ($i % 17 == 0) {
                while ($i <= 1000000) {
                    echo $i . '<br />';
                    $i+=17; // экономия ресурсов
                }
                break;
            }
        }
  2. Сомневаюсь, что это нормальное решение:
        for ($a = 0, $b = 1, $i = 0; $a <= 100000 || $b <= 100000; $i++) {
            if ($a == 0) {
                echo $a.'<br />';
            }
            if ($a < $b) {
                $a = $a+$b;
                echo $a.'<br />';
            } elseif ($a >= $b) {
                $b = $a+$b;
                echo $b.'<br />';
            }
            if ($b == 1) {
                echo $b.'<br />';
            }
        }
ivashkevich
ivashkevich
  1. Лишний цикл while, можно просто убрать $i++ из скобок и делать его, если число не разделилось. А если разделилось, то можно уже +17 делать.
    За то, что вы в принципе задумались об оптимизации, ставлю вам большущий плюс.
  2. Ну да, что-то вы перемудрили тут. Нагуглите алгоритм нахождения чисел фибоначи, он проще, чем вы думаете. Ну или можете поискать более простое решение в комментах выше.
stasokulov@gmail.com
stasokulov@gmail.com
<?php

$a = 0;
$b = 1;

for(;$a<=100000;)
{
    echo $a.'<br>';
    $b = $b + $a;
    $a = $b - $a;   
}
Art
Art
//==================================
$i = 1000;
while (($i % 17) != 0)
    $i++;

for (; $i < 1000000; $i += 17)
    echo '<br>' . $i;

//==================================
$pre = 0;
for ($fib = 1; $fib < 100000; $fib += $pre) {
    echo '<br>' . $pre;
    echo '<br>' . $fib;
    $pre += $fib;
}
ivashkevich
ivashkevich
  1. Сложно, подумайте над упрощением. Можно обойтись одним циклом.
  2. Всё хорошо.
Art
Art
//==================================
$i = 1000;
//Находим первое число больше 1000 которое делится на 17
//в данном случае после прохода цикла $i=1003
while (($i % 17) != 0)
    $i++;

//Выводим оставшиеся числа до 1000000, просто прибавляя к $i
//каждый раз значение 17
//кстати в коде выше не совсем правильно, наверное лучше ставить в цикле <=
//в данном примере это не имеет значения, но с другими делителями можно 
//недополучить последнее значение
for (; $i <= 1000000; $i += 17)
    echo '<br>' . $i;

//Можно одним циклом, но зачем проверять каждый раз делимость на 17, 
//если можно не проверять

//хотя может можно и не проверять, и одним циклом сделать, 
//но в голову ничего не приходит(
ivashkevich
ivashkevich

Хорошо, пусть будет с такой оптимизацией)

tmv.nika@mail.ru
tmv.nika@mail.ru
$x = 0;
$y = 1;
echo $x;
for (; $z <= 100000; $z = $x + $y) {
    echo $z . ' ';
    $x = $y;
    $y = $z;
}
ilyaOrlov
ilyaOrlov

Имеет ли место такое решение второго задания?

<?php
$a = 0;
$b = 1;
$c = 0;
echo $a . ' ';
echo $b . ' ';
for (; $b < 100000; ) {
    $c = $a + $b;
    $a = $b;
    $b = $c;
    if ($b < 100000) {
        echo $b . ' ';
    }
}
ivashkevich
ivashkevich

Вполне норм)