Ошибки, сложный материал, вопросы >
Нашли опечатку или неточность?

Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.

Что-то не получается или материал кажется сложным?

Загляните в раздел «Обсуждение»:

  • задайте вопрос нашим менторам. Вы быстрее справитесь с трудностями и прокачаете навык постановки правильных вопросов, что пригодится и в учёбе, и в работе программистом;
  • расскажите о своих впечатлениях. Если курс слишком сложный, подробный отзыв поможет нам сделать его лучше;
  • изучите вопросы других учеников и ответы на них. Это база знаний, которой можно и нужно пользоваться.
Об обучении на Хекслете

Агрегация

Ещё один распространённый вариант использования циклов на массивах — агрегация. Агрегацией являются любые вычисления, которые строятся на основе всего набора данных, например, поиск максимального, среднего, суммы и так далее. Агрегирующие функции особенно популярны у тех кто работает с цифрами, например про них хорошо знают все кто пользуются таблицами (Google Table, Microsoft Excel).

<?php

function calculateMax($coll)
{
    // Если коллекция пустая, то у нее не может быть максимального значения
    // В подобных ситуациях принято возвращать null
    if (empty($coll)) {
        return null;
    }

    // Сравнение элементов нужно начать с какого-то первого элемента
    $max = $coll[0]; // Принимаем за максимальное первый элемент
    // Обход начинаем со второго элемента
    for ($i = 1; $i < sizeof($coll); $i++) {
        // Если текущий элемент больше максимального,
        // то он становится максимальным
        if ($coll[$i] > $max) {
            $max = $coll[$i];
        }
    }

    // Не забываем вернуть максимальное число
    return $max;
}

print_r(calculateMax([]));
print_r(calculateMax([3, 2, -10, 38, 0]));

// => 38

https://repl.it/@hexlet/php-arrays-aggregation-max

Алгоритм поиска максимального числа в массиве выглядит так:

  1. Если массив пустой, то возвращаем null. Это классический пример использования идиомы guard expression (охраняющее выражение). Её идея в том, что в начале функции проверяются самые простые условия, для которых нужен минимум вычислений. При таком подходе основной код находится на верхнем уровне, а не размещён внутри условной конструкции. Такой код легче читать и у него меньше вложенность.
  2. В ином случае берём за точку отсчёта первый элемент массива и считаем его максимальным.
  3. Обходим массив, начиная со второго элемента и сравниваем каждое значение с максимальным. Если текущий рассматриваемый элемент больше максимального, то он становится максимальным.
  4. После обхода возвращаем результат.

Главное, что нужно увидеть в этом коде — место определения переменной $max. Новички часто забывают про то, что переменную нужно определить до её использования. Объявленные же внутри цикла переменные не должны использоваться снаружи за пределами цикла, поэтому переменная и определяется до его начала. В большинстве языков переменные, определённые внутри блока кода (тело цикла в нашем случае) видны только внутри этого блока, то есть их область видимости ограничивается блоком кода. Соответственно, получить доступ к этим переменным вне блока невозможно.

Обратите внимание, что начальным значением $max взят первый элемент, а не, скажем, 0. Ведь может оказаться так, что все числа в массиве меньше 0, и тогда мы получим неверный ответ.

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

Нейтральный элемент

Рассмотрим поиск суммы:

<?php

function calculateSum($coll)
{
    // Начальное значение суммы
    $sum = 0;
    foreach ($coll as $num) {
        // Поочередно складываем все элементы
        $sum += $num;
    }

    return $sum;
}

// Сумма элементов всегда возвращает какое-то число
// Если массив пустой, то сумма его элементов 0
print_r(calculateSum([]));
print_r("\n");
print_r(calculateSum([3, 2, -10, 38, 0]));
// => 0
// => 33

https://repl.it/@hexlet/php-arrays-aggregation-sum

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

Чему равна сумма элементов пустого массива? С точки зрения математики такая сумма равна 0. Что в принципе совпадает со здравым смыслом. Если у нас нет яблок, значит у нас есть 0 яблок (количество яблок равно нулю). Функции в программировании работают по этой логике.

Второй момент связан с начальным элементом суммы. В коде используется 0 или так называемый нейтральный элемент операции сложения на множестве вещественных чисел. Нейтральный элемент бинарной операции — элемент, который ничего не меняет в результате его использования. По-простому, сложение любого числа с нулём всегда даёт это же число. Тогда любую сумму, например 3 + 2 + 8, можно вычислить как 0 + 3 + 2 + 8, чем мы и пользуемся в нашем коде. Нейтральный элемент – важная часть любой агрегирующей операции. Именно с него начинается сам процесс агрегации. В случае сложения – это 0, в случае умножения – 1.

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


<span class="translation_missing" title="translation missing: ru.web.courses.lessons.mentors.mentor_avatars">Mentor Avatars</span>

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят менторы из команды Хекслета или другие студенты.

Для полного доступа к курсу нужна профессиональная подписка

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

Получить доступ
115
курсов
892
упражнения
2241
час теории
3196
тестов

Зарегистрироваться

или войти в аккаунт

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.

  • 115 курсов, 2000+ часов теории
  • 800 практических заданий в браузере
  • 250 000 студентов

Отправляя форму, вы даёте своё согласие на обработку персональных данных в соответствии с «Политикой конфиденциальности» и соглашаетесь с «Условиями оказания услуг». Защита от спама reCAPTCHA «Конфиденциальность» и «Условия использования».

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Rambler
Логотип компании Bookmate
Логотип компании Botmother

Есть вопрос или хотите участвовать в обсуждении?

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы даёте своё согласие на обработку персональных данных в соответствии с «Политикой конфиденциальности» и соглашаетесь с «Условиями оказания услуг». Защита от спама reCAPTCHA «Конфиденциальность» и «Условия использования».