20.09.2017   425
Цикл 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;

За новыми уроками следите в наших группах в социальных сетях, ссылки на них вы найдёте в шапке сайта. Если этот урок был вам полезен, расскажите об этом курсе своим знакомым или поделитесь на него ссылкой в социальных сетях. Также, если вы хотите помочь проекту материально – вы можете стать патроном проекта – это самые преданные и благодарные читателей, которые вносят неоценимый вклад в развитие проекта. А данный урок вышел при поддержке патрона Евгения Акопяна. Спасибо!

Домашнее задание
Для просмотра домашки нужно войти на сайт.
Или получить доступ прямо сейчас:


Нажимая эту кнопку
Вы принимаете политику конфиденциальности

Комментарии

 mahasamatman 2017-09-22 13:37:58
+1

<?php

$carsSpeeds = [
    95,
    140,
    78
];

$sumOfSpeeds = 0;
$countOfCars = 0;

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

$averageSpeed = $sumOfSpeeds / $countOfCars;

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

Ответить
  •  ivashkevich 2017-09-22 13:49:16
    0

    Всё правильно)

    Ответить
    •  vasyaproject 2017-10-10 21:19:49
      0

      А я не так делал, просто добавил $index и подсчитал его, это неправильно?

      <?php 
      
      $carWeight = [
          905,
          1200,
          1400
      ];
      
      echo "Вес первой машины $carWeight[0] кг <br>
      Вес второй машины $carWeight[1] кг <br>
      Вес третьей машины $carWeight[2] кг <br>";
      
      $sumCarWheight = 0;
      
      foreach ($carWeight as $index => $wheight) {
          $sumCarWheight += $wheight;
          $sumCarIndex += $index;
      }
      
      echo 'Средний вес машин = ' . $sumCarWheight / $sumCarIndex . 'кг';
      
      ?>

      Ответить
      •  vasyaproject 2017-10-10 21:30:15
        0

        а нее, это неправильно :( уже сам увидел ошибку, если так, то оно просто складывает не порядковые index, а их числовые значения, надо тогда наверно так $sumCarIndex = $index + 1; или использовать такое $sumCarIndex = ++$index;

        <?php 
        
        $carWeight = [
            905,
            1200,
            1400
        ];
        
        echo "Вес первой машины $carWeight[0] кг <br>
        Вес второй машины $carWeight[1] кг <br>
        Вес третьей машины $carWeight[2] кг <br>";
        
        $sumCarWheight = 0;
        
        foreach ($carWeight as $index => $wheight) {
            $sumCarWheight += $wheight;
            $sumCarIndex = $index + 1;
        }
        
        echo 'Средний вес машин = ' . $sumCarWheight / $sumCarIndex . 'кг';
        
        ?>

        Ответить
        •  ivashkevich 2017-10-11 14:03:55
          0

          Нет, неправильно. $sumCarIndex - сумма индексов, и она никак не соотносится с числом автомобилей, на которое нужно поделить сумму весов.
          Вам просто повезло, что 0 + 1 + 2 = 3.
          Если появится ещё один автомобиль то у вас уже будет 0 + 1 + 2 + 3 = 6.

          Ответить
 trialex3 2017-09-22 20:48:36
0

<?php
$carsSpeeds = [
    95,
    140,
    78,
    100,
    39
];
$sumOfSpeed = 0;
foreach ($carsSpeeds as $speed) {
    $sumOfSpeed += $speed;
}
$countOfCars = count($carsSpeeds);

$averageSpeed = $sumOfSpeed / $countOfCars;

echo 'Средняя скорость ' . $countOfCars . ' машин, ' . ' движущихся со скоростями ';
foreach ($carsSpeeds as $speed) {
    echo $speed . ', ';
}
echo 'равняется ' .'~' . (int)$averageSpeed;
?>

Ответить
Чтобы написать комментарий нужно войти на сайт.
Или получить доступ прямо сейчас:


Нажимая эту кнопку
Вы принимаете политику конфиденциальности