PHP: Условия внутри тела цикла
Тело цикла, как и тело функции — это место выполнения инструкций. Значит, мы можем использовать внутри него всё изученное ранее, например — условные конструкции. Так программа повторяет одно действие несколько раз, но на каждом повторе принимает решение.

Пусть нужно пройти числа от 1 до 10 и напечатать только четные. Цикл перебирает все числа подряд, а условие внутри цикла решает, какие из них попадут на экран.
Для перебора нужен счетчик. Он хранит текущее число и увеличивается после каждого повтора. Печатать число нужно только тогда, когда оно проходит проверку:
<?php
$number = 1;
while ($number <= 10) {
if ($number % 2 === 0) {
print_r("{$number}\n");
}
$number = $number + 1;
}
// => 2
// => 4
// => 6
// => 8
// => 10Цикл while перебирает числа от 1 до 10. Условие внутри цикла проверяет текущее число. Если $number % 2 === 0, число делится на 2 без остатка, и программа выводит его на экран.
Счетчик увеличивается после проверки в любом случае. Это важно. Если увеличивать $number только внутри if, цикл остановится на первом нечетном числе и будет работать бесконечно.
Работа по шагам
Перед первым повтором $number равен 1.
Шаг 1. Условие цикла $number <= 10 истинно, поэтому программа входит в тело цикла. Число 1 нечетное, блок if не выполняется. Затем $number увеличивается до 2.
Шаг 2. Условие цикла снова истинно. Число 2 четное, поэтому программа печатает 2. Затем $number увеличивается до 3.
Дальше цикл продолжает проверять каждое число. Нечетные числа он пропускает, а четные выводит на экран. Когда $number станет равен 11, условие $number <= 10 станет ложным, и цикл завершится.
Условия меняют действие, а не движение
В таких циклах удобно разделять две части. Счетчик переводит программу к следующему значению, а if решает, что делать с текущим значением.
<?php
$number = 1;
while ($number <= 10) {
if ($number > 5) {
print_r("{$number}\n");
}
$number = $number + 1;
}Здесь цикл проходит тот же диапазон от 1 до 10, но условие внутри другое. Поэтому программа печатает только числа больше 5.
Условие внутри цикла может проверять что угодно. Например, четность числа, совпадение символа, длину строки или значение переменной. Главное, чтобы счетчик продолжал меняться, и цикл мог завершиться.
Задание
Реализуйте функцию countHashtags(), которая принимает текст публикации и считает, сколько раз в нем встречается символ #.
<?php
countHashtags('New post #php #code'); // 2
countHashtags('No tags here'); // 0
countHashtags('#start and #finish'); // 2PHP: Условия внутри тела цикла
Тело цикла, как и тело функции — это место выполнения инструкций. Значит, мы можем использовать внутри него всё изученное ранее, например — условные конструкции. Так программа повторяет одно действие несколько раз, но на каждом повторе принимает решение.

Пусть нужно пройти числа от 1 до 10 и напечатать только четные. Цикл перебирает все числа подряд, а условие внутри цикла решает, какие из них попадут на экран.
Для перебора нужен счетчик. Он хранит текущее число и увеличивается после каждого повтора. Печатать число нужно только тогда, когда оно проходит проверку:
<?php
$number = 1;
while ($number <= 10) {
if ($number % 2 === 0) {
print_r("{$number}\n");
}
$number = $number + 1;
}
// => 2
// => 4
// => 6
// => 8
// => 10Цикл while перебирает числа от 1 до 10. Условие внутри цикла проверяет текущее число. Если $number % 2 === 0, число делится на 2 без остатка, и программа выводит его на экран.
Счетчик увеличивается после проверки в любом случае. Это важно. Если увеличивать $number только внутри if, цикл остановится на первом нечетном числе и будет работать бесконечно.
Работа по шагам
Перед первым повтором $number равен 1.
Шаг 1. Условие цикла $number <= 10 истинно, поэтому программа входит в тело цикла. Число 1 нечетное, блок if не выполняется. Затем $number увеличивается до 2.
Шаг 2. Условие цикла снова истинно. Число 2 четное, поэтому программа печатает 2. Затем $number увеличивается до 3.
Дальше цикл продолжает проверять каждое число. Нечетные числа он пропускает, а четные выводит на экран. Когда $number станет равен 11, условие $number <= 10 станет ложным, и цикл завершится.
Условия меняют действие, а не движение
В таких циклах удобно разделять две части. Счетчик переводит программу к следующему значению, а if решает, что делать с текущим значением.
<?php
$number = 1;
while ($number <= 10) {
if ($number > 5) {
print_r("{$number}\n");
}
$number = $number + 1;
}Здесь цикл проходит тот же диапазон от 1 до 10, но условие внутри другое. Поэтому программа печатает только числа больше 5.
Условие внутри цикла может проверять что угодно. Например, четность числа, совпадение символа, длину строки или значение переменной. Главное, чтобы счетчик продолжал меняться, и цикл мог завершиться.
Задание
Реализуйте функцию countHashtags(), которая принимает текст публикации и считает, сколько раз в нем встречается символ #.
<?php
countHashtags('New post #php #code'); // 2
countHashtags('No tags here'); // 0
countHashtags('#start and #finish'); // 2Ваше упражнение проверяется по этим тестам
<?php
namespace HexletBasics\Loops\ConditionsInsideLoops;
use HexletBasics\Exercise\TestCase;
class SolutionTest extends TestCase
{
public function test()
{
$this->assertEquals(2, countHashtags('New post #php #code'));
$this->assertEquals(0, countHashtags('No tags here'));
$this->assertEquals(2, countHashtags('#start and #finish'));
$this->assertEquals(0, countHashtags(''));
}
}Решение учителя откроется через:
20:00
