Цикл foreach: урок с практикой

Цикл foreach в PHP

Всем привет! В прошлом уроке мы с вами изучили основы массивов в PHP. Как вы уже поняли, массив может иметь довольно много элементов, и каждый из этих элементов, в свою очередь, также может являться массивом. Само собой, напрашивается вопрос: «А можно ли как-то автоматизировать обход по массиву?». То есть обращаться к его элементам по одному, не указывая при этом индексы значений. Ответ – можно. Для этого в PHP есть такая замечательная вещь, как циклы.

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

$carsSpeeds = [
    95,
    140,
    78
];

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

$averageSpeed = ($carsSpeeds[0] + $carsSpeeds[1] + $carsSpeeds[2]) / 3;

Простейшая школьная математика. Однако, если представить, что таких значений в массиве будет хотя бы 10, это уже приведёт к значительному разрастанию выражения. На помощь нам приходят циклы в PHP.

Рассмотрим в первую очередь языковую конструкцию foreach (от английского for – для, each - каждый). Она позволяет пройтись по каждому элементу массива. Она просто проходит по каждому элементу массива по очереди и позволяет выполнить с ним какое-либо действие.
Использование конструкции выглядит следующим образом:

foreach ($array as $index => $value) {
    ...
}

где $array – это массив, $index и $value – это индекс и значение элемента на текущем шаге соответственно. Они на каждом новом элементе просто изменяют свои значения. Переменные $index и $value определяются прямо здесь, их раньше могло не существовать, они определяются прямо в процессе обхода массива.

То, что находится внутри фигурных скобок будет повторяться для каждого элемента массива. Один такой проход называется шагом или итерацией. Один элемент = одна итерация. Запомните это слово.
Цикл будет идти по массиву, пока не закончатся все элементы. Затем программа продолжит своё выполнение.

Давайте в качестве примера со скоростями обойдём массив и просто выведем индексы массива и его значения.

<?php

$carsSpeeds = [
    95,
    140,
    78
];

foreach ($carsSpeeds as $index => $speed) {
    echo $index . ' ' . $speed . '<br>';
}

Результат:

0 95
1 140
2 78

Как мы видим, на первом шаге цикла в переменные $index и $speed попали значения 0 и 95 соответственно. На втором – 1 и 140 и так далее. Всё как мы и ожидали. Было выполнено 3 итерации.

Если нам не нужны индексы массива, то их можно не указывать в этой конструкции:

foreach ($array as $value) {
    ...
}

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

Вернёмся к задаче

Итак, нам нужно найти среднюю скорость. Для этого нам нужно:

  1. сложить все значения скоростей
  2. поделить получившуюся сумму на кол-во значений

Для того, чтобы выполнить первый шаг, давайте прибегнем к помощи цикла foreach:

<?php

$carsSpeeds = [
    95,
    140,
    78
];

$sumOfSpeeds = 0;

foreach ($carsSpeeds as $speed) {
    $sumOfSpeeds += $speed;
}

echo $sumOfSpeeds;

Перед началом цикла определили переменную $sumOfSpeeds равную 0, а затем на каждой итерации прибавляли к ней значения скоростей. В конце просто вывели получившийся результат, который равен 313. Можете проверить на калькуляторе.

Теперь нужно разделить получившееся значение на число элементов.

Чтобы узнать число элементов в массиве можно прибегнуть к функции count($carSpeeds) – на вход передаётся имя массива. Полностью наш код будет выглядеть следующим образом:

<?php

$carsSpeeds = [
    95,
    140,
    78
];

$sumOfSpeeds = 0;

foreach ($carsSpeeds as $speed) {
    $sumOfSpeeds += $speed;
}

$countOfCars = count($carsSpeeds);

$averageSpeed = $sumOfSpeeds / $countOfCars;

echo 'Средняя скорость движения по трассе: ' . $averageSpeed;

На этом всё. Всем пока!

Присоединяйтесь к нам в Twitter, ВКонтакте, Facebook и Google+, а также вступайте в наш чат в Telegram, чтобы не пропустить новые уроки и быть в курсе последних новостей из мира веб-разработки.
Домашнее задание

  • Придумайте способ обойтись без использования функции count.