Чат веб-разработчиков
Цикл while в PHP: урок с примерами

While: самый простой цикл в PHP

В этом уроке мы поговорим о ещё одном цикле в PHP – цикле while. Этот цикл является самым простым из всех. Его структура выглядит следующим образом:

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

Если результат выражения в круглых скобках – true, будут выполнены действия в фигурных скобках. После этого снова будет произведена проверка выражения на истинность. Цикл будет прекращен, когда результат выражения окажется равным false. While в переводе с английского означает «до тех пор пока». Так и получается, цикл будет выполняться до тех пор, пока условие выполняется. Давайте рассмотрим несколько простых примеров, когда цикл while будет нам полезен.

Задача #1 – вывести числа от 0 до 10

Решение с использованием цикла while:

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

Сначала определили переменную $i = 0. Затем в условии цикла while говорим, что нужно выполнять его, пока $i меньше либо равно 10. На каждой итерации мы выводим переменную $i и после вывода увеличиваем её на единицу. Выводим тег переноса строки и снова переходим к условию. И так до тех пор, пока $i не станет равной 11. В этот момент условие не выполнится и цикл завершится.

Задача #2 – вывести степени числа 2, меньшие 100000

Решение:

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

Результат:

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

Пояснять не буду, всё довольно просто.

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


SBTesla
SBTesla
<?php

$num = 344;
while ($num <= 357) {
    if ($num % 2 == 0) {
        $arr[] = $num;
    }
    $num++;
}

foreach ($arr as $key => $value) {
    echo $value;
    echo "<br>";
}
<?php
/*Выводим все сотые  числа*/
$num = 0;
while ($num < 1000) {
    if ($num) {
        $arr[] = $num;
    }
    $num+= 100;
}

foreach ($arr as $key => $value) {
    echo $value;
    echo "<br>";
}
ivashkevich
ivashkevich
  1. Если входные условия поменяются, и нужно будет найти все чётные числа от 344, то число 344 будет пропущено, а проверяться сразу будет 345. Аналогично с верхней границей, если было бы 358, то оно тоже было бы пропущено. Переделайте алгоритм так, чтобы граничные значения тоже учитывались.
  2. Так неправильно:
    if ($i % 2) { } 
    else { $arr[] = $i;}

    Правильно вот так:

    if ($i % 2 === 0) {
        $arr[] = $i;
    }

    Во-первых, ни в коем случае не должно быть пустых блоков. Можно инвертировать условия с помощью логического НЕ (оператор !). То есть не писать:

    if ($x) {
        //это мне ни к чему
    } else {
        //а вот здесь я что-то сделаю
    }

    А писать:

    if (!$x) {
        //здесь я что-то сделаю
    }

    Здесь вы посмотрели, что если $i делится на 2 с остатком (остаток - 1, будет преобразовано в true), то это не то что вам нужно. И добавили else и его уже обработали.
    Хотя можно было сделать просто подходящее условие - если остаток от деления на 2 равен 0.

  3. Блоки if всегда нужно писать в виде:
    if (условие) {
        //то
    }

    Никаких в одну строку и прочих лишних переносов.

  4. Один отступ всегда должен быть равен четырем пробелам. А у вас echo пляшут как хотят. Используйте автоформатирование в PHPStorm - одновременное нажатие CTRL+ALT+L

Поправьте эти небольшие недочёты и попробуйте снова.

trialex3
trialex3
<?php
$arr = [];
$x = 345;
while ($x <= 357) {
    if ($x % 2 == 0) {
        $arr[] = $x;
    }
    $x++;
}

foreach ($arr as $value) {
    echo $value . ', ';
}
?>
ivashkevich
ivashkevich

Всё верно, образцовая работа.

Watcher
Watcher

$arr = [];
можно опустить
тоже работает )))

ivashkevich
ivashkevich

Можно, но лучше писать, так более очевидно.

WarLikeLaux
WarLikeLaux

https://pp.userapi.com/c824504/v824504838/1c106/WB8KDf9xzn0.jpg

ivashkevich
ivashkevich

Всё хорошо, но код лучше оформлять текстом, как я вам и говорил. С помощью markdown-разметки:
```
код
```

Закрывающий тег ?> в конце не нужен.

serb2017
serb2017
<?php

$i = 346;
$i1 = 357;

if ($i % 2 !== 0) {$i=$i+1;}

while ($i <= $i1) {
    $array1 [] = $i;
    $i = $i + 2;
    }

foreach ($array1 as $i) {
    echo $i;
    echo '<br>';
};
ivashkevich
ivashkevich

У вас всё хорошо и с логикой и с алгоритмами. Есть только небольшая проблема со стилем кода и названиями переменных. То что находится внутри фигурных скобок нужно выносить на отдельные строки. Вот так:

if (условие) {
    действие
}

Переменную $i лучше назвать $from. $i1 лучше назвать $to.
При добавлении новых элементов в массив в конструкции между именем массива и квадратными скобками не должно быть пробелов. Вот так:

$arr[] = 123;

Позже напишу отдельную статью по этой теме. И еще раз - с задачей вы справились на все 100%. Кодстайл - это уже профессиональный уровень, но будет хорошо если вы уже сейчас начнете писать следуя этим правилам. Это даст вам преимущество.

serb2017
serb2017

Благодарю Вас за совет. Действительно, нужно быть внимательным к "мелочам", особенно в жизни !

1nSide
1nSide

Не получилось в одной строке ваил условия написать для вывода(

$i = 345;
$array = [];

while ($i <= 357)
{
    if($i%2==0){
        $array[] = $i;
    }
    $i++;
}

foreach ($array as $value)
{
    echo $value . '  ';
}
ivashkevich
ivashkevich

А их и не надо в одну строку писать, тут всё правильно и понятно :)

1nSide
1nSide

Ну или так, так вроде еще никто не делал)

$i = 345;
$array = [];

while ($i <= 357)
{
        $array[] = $i;
        $i++;
}

foreach ($array as $value)
{
    if($value%2==0)
    {
        echo $value . '  ';
    }
}
ivashkevich
ivashkevich

Не соответствует заданию, так как массив должен содержать только чётные числа

1nSide
1nSide

Еще так можно

$i = 345;
$array = [];

do
{
    if($i%2==0)
    {
    $array[] = $i;
    $i++;
    }
} while ($i <= 357);

foreach ($array as $value)
{
        echo $value . '  ';
}
ivashkevich
ivashkevich

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

1nSide
1nSide

Теперь работает))

$i = 345;
$array = [];

do
{
    if($i%2==0)
    {
    $array[] = $i;
    }
    $i++;
} while ($i <= 357);

foreach ($array as $value)
{
        echo $value . '  ';
}
ivashkevich
ivashkevich

Другое дело! :)

SlipKnot
SlipKnot
<?php

$x = 345;
while ($x < 357) {
    if ($x % 2 == 0) {
        $array[] = $x;
        }
     $x ++;
}

foreach ($array as $key)
{
    echo $key . "<br>";
}
ivashkevich
ivashkevich

Тут всё гуд) Потенциально может возникнуть ошибка, если вместо 357 мы захотим установить границу 358. Более надежным и универсальным условием будет меньше либо равно:

while ($x <= 357) {
SlipKnot
SlipKnot
<?php
$x = 345;
while ($x <= 357) {
    if ($x % 2 == 0) {
        $array [] = $x;
    }
    $x ++;
}
foreach ($array as $item) {
    echo $item . '<br>';
}
ivashkevich
ivashkevich

Отлично =)

Fox-24
Fox-24

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

<?php

$startnum = 345; 
$endnum = 357;
$array = [];

while ($endnum != $startnum) {
    $res = $endnum % 2;
    --$endnum;

    if ($res != 0) {
        $array[] = $endnum;
    }
}

foreach ($array as $value) {
    echo $value . '</br>';
}
ivashkevich
ivashkevich

ААА, ты куда так разогнался, я не успеваю проверять=)

Хорошо, но можно чуть упростить:

while ($endnum != $startnum) {
    if ($endnum % 2 !== 0) {
        $array[] = $endnum;
    }
    $endnum--;
}

То есть не зачем создавать переменную $res - можно сразу проверять.

Fox-24
Fox-24

Да, прет меня от уроков с этого сайта xD

ААА, ты куда так разогнался, я не успеваю проверять=)

Согласен, был такой вариант, пробовал, но что-то пошло не так, видимо была синтаксическая ошибка. Спасибо:)

ArtemijeKA
ArtemijeKA

1.

$a = 345;
$arr = [];
while ($a <= 357) {
    if ($a % 2 == 0) {
        $arr[] = $a;
    }
    $a++;
}
foreach ($arr as $val) {
    echo $val . '<br />';
}