Перейти к основному содержимому

Группировка коллекции

Группировка — это распределение элементов по «корзинам». Для каждого элемента вы выбираете ключ, и все элементы с одинаковым ключом попадают в одну корзину.

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

В PHP нет встроенной функции groupBy. Естественный способ группировки — ассоциативный массив, ключами которого являются ключи групп, а значениями — массивы элементов. Один цикл foreach заполняет его выражением $groups[$key][] = $element. Добавление элемента по ещё не существующему ключу просто начинает новую группу — отдельный случай обрабатывать не нужно.

Ассоциативный массив PHP сохраняет порядок вставки: группы идут в том порядке, в каком появился их первый элемент, и выводимый результат одинаков при каждом запуске.


Группировка по ключу

Самая простая группировка оставляет элементы как есть и только решает, в какую корзину попадёт каждый из них.

Вычислите ключ внутри цикла и добавьте элемент в $groups[$key]. Результат сопоставляет каждому ключу массив элементов с этим ключом. Элементы внутри группы сохраняют порядок, который они имели во входных данных.

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

Группировка слов по первой букве

$w[0] берёт первую букву слова, а strtoupper() переводит её в верхний регистр. Слова, начинающиеся с одной и той же буквы, оказываются в одном массиве. Группы идут в порядке вставки: O, затем T, затем F.

Prompt
Сгруппируйте слова one, two, three, four, five по первой букве, приведённой к верхнему регистру. Постройте ассоциативный массив в цикле foreach с помощью $byFirstLetter[$key][] = $w и выведите его через json_encode.
Вывод: PHP-скрипт
Group words by first letter

Группировка с изменением значений

Ключ — первая буква в нижнем регистре. Сохраняемое значение — всё слово в верхнем регистре. Цикл вычисляет и то и другое и добавляет значение в $groups[$key].

Prompt
Сгруппируйте слова one, two, three, four, five по первой букве в нижнем регистре. Сохраняйте в группе каждое слово в верхнем регистре, а не в исходном виде. Вычислите ключ и новое значение в цикле foreach, добавляйте элемент через $groups[$key][] = $value и выведите массив через json_encode.
Вывод: PHP-скрипт
Group and change the values

Подсчёт элементов каждой группы

Часто элементы каждой группы не нужны — важно только их количество.

В PHP есть встроенный счётчик: array_count_values(). Он подсчитывает, как часто каждое значение встречается в массиве. Чтобы подсчитать слова по первой букве, сначала превратите каждое слово в его первую букву с помощью array_map(), а затем позвольте array_count_values() подсчитать буквы.

Подсчёт слов по первой букве

array_map() превращает слова в буквы o, t, t, f, f. Затем array_count_values() подсчитывает каждую букву: одна o, две t, две f.

Prompt
Подсчитайте, сколько из слов one, two, three, four, five начинается с каждой буквы. Превратите слова в их первые буквы с помощью array_map, подсчитайте буквы через array_count_values и выведите результат через json_encode.
Вывод: PHP-скрипт
Count words per first letter

Свёртка и редукция по группам

Свёртка группы — это пошаговое объединение её элементов в одно значение. Классический пример — текущая сумма: начните с 0 и прибавляйте каждый элемент.

Способ PHP — ассоциативный массив, который хранит текущее значение каждой группы. Для каждого элемента вычислите его ключ и обновите значение, сохранённое под этим ключом.

Чтение ещё отсутствующего в массиве ключа вызвало бы предупреждение, поэтому используйте оператор ??: $sums[$key] ?? 0 без лишнего шума даёт 0, когда ключа нет. Если значение должно начинаться с самого первого элемента, проверяйте наличие ключа с помощью isset().

Сумма каждой группы

Каждое число попадает в группу "even" или "odd" и прибавляется к сумме этой группы. ($sums[$key] ?? 0) + $n начинает новую группу с 0, поэтому отдельный случай не нужен.

Prompt
Возьмите числа 3, 4, 5, 6, 7, 8 и отнесите каждое из них к группе "even" или "odd". Добавляйте каждое число к текущей сумме его группы с помощью $sums[$key] = ($sums[$key] ?? 0) + $n, чтобы отсутствующий ключ начинался с 0. Выведите массив через json_encode.
Вывод: PHP-скрипт
Sum each group

Построение строки для каждой группы

Первое число группы начинает строку. Каждое следующее число присоединяется через "+". isset($chains[$key]) различает эти два случая, а (string)$n превращает первое число в текст.

Prompt
Возьмите числа 3, 4, 5, 6, 7, 8 и отнесите каждое из них к группе "even" или "odd". Для каждой группы постройте строку шаг за шагом: первое число начинает строку, а каждое следующее добавляется с "+" перед ним, что даёт текст вида 3+5+7. Используйте isset, чтобы различить эти два случая, и выведите массив через json_encode.
Вывод: PHP-скрипт
Build a string per group