Codebra
29 января 2026 в 19:56

Урок 12. Циклы foreach и for в PHP

Изучим, как эффективно использовать циклы for и foreach для перебора массивов. Рассмотрим синтаксис, преимущества и примеры кода для каждого типа цикла.
📝

Внимание! На этой странице вы найдете материал урока из архивного курса по PHP. Курс был написан в 2024 году одним из первых учеников Codebra и, к моменту написания курса, опытным бэкэнд-разработчиком. К сожалению, курс не был дописан, а его автор молча пропал.

Полный список уроков доступен по тегу Архивный курс по PHP и на странице первого урока.

📝 Кратко

Обзор циклов в программировании на PHP

  • Циклы while и do-while используются реже, чем циклы for и foreach.
  • Цикл for более гибкий, но требует создания переменных для счётчиков.
  • Вложенный цикл for позволяет перебирать массивы с разными счётчиками.
  • Цикл foreach прост в использовании и перебирает все элементы массива.

Использование операторов break и continue

  • Оператор break прерывает текущий цикл.
  • Оператор continue пропускает текущую итерацию цикла.

Задачи для закрепления материала

  • Создание массивов и перебор чисел с помощью циклов for и foreach.
  • Использование операторов break и continue для управления циклами.
  • Вычисление сумм и печать элементов массивов с условиями.
  • Создание ассоциативных массивов и перебор элементов с условиями.

Переход к следующему уроку

Мы c вами узнали из предыдущего урока о циклах while и do-while. Честно сказать, эти циклы не так часто используются, как циклы for и foreach. Нам часто будет необходимо перебирать значения и делать необходимые операции с ними, давайте поэтому познакомимся и с более используемыми циклами.

Цикл for

Этот вид циклов сложнее while и do-while, но он более гибкий: нам не нужно создавать лишние переменные для счётчиков и по вложенным массивам он проходится более читабельно.

for (аргумент 1; аргумент 2; аргумент 3) {
	// Тело цикла
}

Выше в псевдокоде я написал актуальный синтаксис оператора for. Каждый аргумент должен быть разделён точкой с запятой (;). Вот что нужно писать в каждом аргументе:

  • аргумент 1 — создаём переменную-счётчик;
  • аргумент 2 — создаём условие, до каких пор будет выполняться цикл;
  • аргумент 3 — будем после каждого прохода по циклу к счётчику прибавлять значение.
<?php
	$arr = [1, 2, 3, 4, 5];
	//   Аргумент 1
	for ($i = 0; $i < count($arr); $i++) {
		print_r($arr[$i]); // Распечатает от 1 до 5
	}
?>

Число переменных значительно уменьшилось с предыдущего раза. Мы даже можем гибко создать обратный цикл:

<?php
	$arr = [1, 2, 3, 4, 5];
	
	for ($i = (count($arr) - 1); $i >= 0; $i--) {
		print_r($arr[$i]); // Распечатает 5, 4, 3, 2, 1
	}
?>

Усложним задачу: у нас есть вложенный массив женских и мужских имён в таком виде:

[
	['Ярослав', 'Михаил', 'Геннадий'],
	['Людмила', 'Ксения', 'София'],
]

Необходимо перебрать массивы и распечатать каждое имя на экран:

<?php
	$arr = 	[
				['Ярослав', 'Михаил', 'Геннадий'],
				['Людмила', 'Ксения', 'София'],
			];
			
	for ($i = 0; $i < count($arr); $i++) {
	    for ($j = 0; $j < count($arr[$i]); $j++) {
	    	print_r($arr[$i][$j] . PHP_EOL);
	    }
	}
?>

Вывод будет таким:

Ярослав
Михаил
Геннадий
Людмила
Ксения
София

Мы с вами создали вложенный массив. Сначала мы перебираем верхний массив с переменной $i, а затем пишем вложенный цикл и перебираем уже вложенные массивы с переменной $j.

💡 Важно

Старайтесь не путать переменные во вложенных циклах. Переменные для каждого цикла должны быть разными.

Таким способом вы можете перебирать очень много вложенных массивов.

Вы могли подумать: «Это же неудобно! Нужно считать вложенные массивы, а если этих значений будет очень много, что делать?»

Хорошая мысль! Нам для этого нужна рекурсия, но об этом в разделе про функции.

Цикл foreach

Самый лёгкий цикл из всех - foreach. В нем нет условий, цикл перебирает все от начала и до конца:

foreach (массив as ключ => значение) {
	// Логика цикла
}

В начале круглых скобок цикла мы указываем перебираемый массив. После ключевого слова as мы указываем ключ и значение. В индексном массиве ключом будет индекс элемента, в ассоциативном — строка.

Мы можем опустить ключ. В таком случае цикл будет брать только значение.

<?php
	$arr = 	['a', 'b', 'c', 'd'];
		
	foreach ($arr as $key => $value) {
		print_r("Ключ: {$key}" . PHP_EOL);
		print_r("Значение: {$value}" . PHP_EOL);
	}
?>

Вывод будет таким:

Ключ: 0
Значение: a
Ключ: 1
Значение: b
Ключ: 2
Значение: c
Ключ: 3
Значение: d

Вы могли заметить константу PHP_EOL - это обычный перевод на новую строку (работает только в консоли, в браузере не будет работать, там нужно использовать HTML теги).

Напишем цикл без ключа:

<?php
	$arr = 	['a', 'b', 'c', 'd'];
		
	foreach ($arr as $value) {
		print_r("Значение: {$value}" . PHP_EOL);
	}
?>

Вывод будет таким:

Значение: a
Значение: b
Значение: c
Значение: d

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

В циклах существуют ещё два очень важный оператора.

  • Оператор break - прерывает выполнение текущего цикла.
  • Оператор continue - выполняет переход к следующей итерации цикла.

Попробуем их на практике. Дан массив и переменная, если в массиве существует значение из переменной необходимо остановить цикл. Для решения задачи будем использовать цикл foreach.

<?php
	$arr = [2, 13, 31, 54, 5776, 67676, 534];
	$number = 5776;
	foreach ($arr as $value) {
		if ($value === $number) {
			break;
		}
		
		print_r($value . PHP_EOL);
	}
?>

Вывод будет таким:

2
13
31
54
5776
67676

Тоже самое с оператором continue, только в таком случае будет пропущена итерация:

<?php
	$arr = [2, 13, 31, 54, 5776, 67676, 534];
	$number = 5776;
	foreach ($arr as $value) {
		if ($value === $number) {
			continue;
		}
		
		print_r($value . PHP_EOL);
	}
?>

Вывод будет таким:

2
13
31
54
67676
534

Заключение

Рассмотрели ещё два важных цикла. Они, на самом деле, очень часто используются в каждом языке. Допустим, функция array_sum() суммирует все элементы массива и возвращает результат. Суммирует она, конечно же, с помощью цикла, так что циклы сплошь и рядом.

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

На этом моменте мы переходим к разделу про функции.

Задачи

  1. Создайте массив из 10 целых чисел. Используя цикл for, выведите на экран только четные числа. Если встречается число 0, прервите цикл.
  2. С помощью цикла foreach переберите массив строк, состоящий из имен. Выведите каждое имя, кроме тех, которые начинаются на букву "А". Используйте оператор continue. (здесь вам нужно будет применить str_starts_with)
  3. Создайте массив из 10 случайных чисел от 1 до 100. Найдите сумму чисел, пока не встретите число больше 50. Используйте цикл for и break.
  4. Используя цикл for, напечатайте числа от 1 до 20. Пропустите числа, кратные 3.
  5. С помощью foreach переберите массив дней недели. Выведите все дни, кроме субботы и воскресенья.
  6. Создайте массив из 15 целых чисел. Используя for, найдите и выведите первое число, которое делится на 5.
  7. Напишите цикл for, который считает от 100 до 0. Пропустите числа, которые делятся на 7, выведите остальные числа.
  8. Создайте ассоциативный массив с названиями фруктов и их ценами. Используя foreach, выведите названия фруктов, чья цена больше 50, и пропустите другие.
  9. С помощью цикла for напечатайте квадрат каждого числа от 1 до 10. Если квадрат равен 36, прервите выполнение цикла.
  10. Используя foreach, переберите массив с числами от 1 до 30. Выведите на экран только те числа, которые не являются делителями 4.
📝

Переходите к следующему уроку курса, а так же не забудьте посмотреть новый материал на Codebra по тегу PHP.