Преобразование коллекции
Преобразование берёт коллекцию, например массив, и строит из неё новую коллекцию. Исходная при этом не меняется.
В PHP для массивов есть большое семейство готовых функций: array_map применяет функцию к каждому элементу, array_merge соединяет массивы, array_combine склеивает ключи со значениями, array_column выбирает одну позицию из каждой строки, а implode превращает массив в текст. Там, где готовой функции не находится, задачу решает короткий цикл foreach.
Один и тот же массив PHP работает и как список, и как хранилище ключ:значение. У простого списка ключи 0, 1, 2 и так далее; у ассоциативного массива ключи выбираете вы. И тот и другой хранят свои элементы в порядке добавления, и оба используются на этой странице.
Map
Операция map применяет одну и ту же функцию к каждому элементу и собирает ответы в новый массив той же длины. Например, она может превратить 1, 2, 3 в 3, 6, 9.
В PHP именно это делает array_map: она принимает сначала функцию, а затем массив, и возвращает новый массив. Функцией часто служит короткая стрелочная функция вида fn($x) => $x * 3.
array_map никогда не меняет исходный массив. Она строит и возвращает новый, так что у вас остаются оба.
Map с помощью array_map
array_map вызывает стрелочную функцию для каждого элемента и возвращает новый массив. Здесь она умножает каждое число на 3, а implode выводит новый массив как 3, 6, 9.
Вывод: PHP-скрипт
<?php
$numbers = [1, 2, 3];
// array_map вызывает функцию для каждого элемента и возвращает новый массив
$tripled = array_map(fn($x) => $x * 3, $numbers);
echo implode(", ", $tripled) . "\n";
Map с индексом
Иногда важна и позиция элемента. foreach даёт и ключ, и значение, а в простом списке ключи — это позиции 0, 1, 2. Здесь каждое значение умножается на свой индекс, поэтому программа выводит 0, 2, 6.
Вывод: PHP-скрипт
<?php
$numbers = [1, 2, 3];
$result = [];
// foreach даёт и ключ (индекс), и значение
foreach ($numbers as $idx => $value) {
$result[] = $value * $idx;
}
echo implode(", ", $result) . "\n";
Пропуск части результатов
Иногда часть результатов нужно отбросить. Верните для них null, а затем уберите значения null с помощью array_filter. Осторожно: array_filter сохраняет исходные ключи, поэтому у отфильтрованного массива остаются ключи 0 и 2, и json_encode выводит его как {"0":3,"2":9}. array_values переиндексирует его в аккуратный список: [3,9].
Вывод: PHP-скрипт
<?php
$numbers = [1, 2, 3];
// возвращаем null для элементов, которые нужно отбросить
$mapped = array_map(fn($x) => $x === 2 ? null : $x * 3, $numbers);
// array_filter убирает null, но сохраняет исходные ключи
$kept = array_filter($mapped, fn($v) => $v !== null);
// array_values переиндексирует массив в 0, 1, 2, ...
$result = array_values($kept);
echo json_encode($kept) . "\n";
echo json_encode($result) . "\n";
Преобразование ключей массива
Чтобы изменить ключи ассоциативного массива, преобразуйте ключи и склейте их обратно со значениями. array_keys даёт все ключи, array_map('strtoupper', ...) переводит их в верхний регистр, а array_combine сопоставляет новые ключи со старыми значениями.
Вывод: PHP-скрипт
<?php
$numbersMap = ["key1" => 1, "key2" => 2];
// переводим каждый ключ в верхний регистр, затем склеиваем новые ключи со старыми значениями
$upperKeys = array_combine(
array_map('strtoupper', array_keys($numbersMap)),
$numbersMap
);
echo json_encode($upperKeys) . "\n";
Преобразование значений массива
Чтобы изменить значения, сохраните ключи и вычислите новые значения. array_map умеет проходить по двум массивам одновременно — здесь по ключам и по значениям, — поэтому каждое новое значение равно старому значению плюс длина его ключа: 1 + strlen("key1") даёт 5.
Вывод: PHP-скрипт
<?php
$numbersMap = ["key1" => 1, "key2" => 2];
// сохраняем ключи, вычисляем новое значение из каждой пары ключ:значение
$newValues = array_combine(
array_keys($numbersMap),
array_map(fn($key, $value) => $value + strlen($key),
array_keys($numbersMap), $numbersMap)
);
echo json_encode($newValues) . "\n";
Zip
Zip берёт два массива и сопоставляет их элементы по позиции: первый с первым, второй со вторым и так далее.
В PHP для этого есть классический приём: array_map(null, $a, $b). Когда обратный вызов равен null и передано несколько массивов, array_map строит массив пар. Обратите внимание, что она не останавливается на более коротком массиве — недостающие места заполняются значением null, — поэтому объединяйте массивы одинаковой длины или сначала обрежьте более длинный с помощью array_slice.
Объединение двух массивов
С null в качестве обратного вызова array_map сопоставляет два массива в массив двухэлементных массивов. json_encode показывает весь результат в одну строку.
Вывод: PHP-скрипт
<?php
$colors = ["red", "brown", "grey"];
$animals = ["fox", "bear", "wolf"];
// array_map с null вместо функции обратного вызова объединяет массивы в пары поэлементно
$pairs = array_map(null, $colors, $animals);
echo json_encode($pairs) . "\n";
Объединение с преобразованием
Сами пары нужны не всегда. Передайте array_map настоящий обратный вызов и оба массива, и она вызовет функцию с одним элементом из каждого. ucfirst переводит первую букву названия животного в верхний регистр.
Вывод: PHP-скрипт
<?php
$colors = ["red", "brown", "grey"];
$animals = ["fox", "bear", "wolf"];
// функция обратного вызова получает по одному элементу из каждого массива
$sentences = array_map(
fn($color, $animal) => "Животное " . ucfirst($animal) . ", цвет: " . $color,
$colors,
$animals
);
echo implode("\n", $sentences) . "\n";
Разделение массива пар
Unzip — обратная операция: один массив пар превращается в два массива. array_column собирает элемент с одной позиции из каждой пары: позиция 0 даёт слова, а позиция 1 — числа.
Вывод: PHP-скрипт
<?php
$numberPairs = [["one", 1], ["two", 2], ["three", 3]];
// array_column выбирает элемент с одной позицией из каждой пары
$words = array_column($numberPairs, 0);
$numbers = array_column($numberPairs, 1);
echo implode(", ", $words) . "\n";
echo implode(", ", $numbers) . "\n";
Associate
Associate строит ассоциативный массив из списка. Каждый элемент даёт один ключ и одно значение. Массив не может дважды содержать один и тот же ключ, поэтому, если два элемента дают одинаковый ключ, побеждает последний.
Приём — обычный цикл foreach: начните с пустого массива и для каждого элемента выполните присваивание $result[$key] = $value. PHP сохраняет элементы в том порядке, в котором они были добавлены.
Элементы как ключи
Сам элемент становится ключом, а значение вычисляется из него. Здесь слова — ключи, а их длины — значения, поэтому программа выводит {"one":3,"two":3,"three":5}.
Вывод: PHP-скрипт
<?php
$numbers = ["one", "two", "three"];
$lengths = [];
// каждое слово становится ключом, его длина становится значением
foreach ($numbers as $word) {
$lengths[$word] = strlen($word);
}
echo json_encode($lengths) . "\n";
Элементы как значения
Элемент становится значением, а ключ вычисляется из него. Здесь ключ — первая буква в верхнем регистре, взятая через $word[0] и strtoupper. И two, и three начинаются с T, поэтому three заменяет two и в массиве остаётся только два элемента.
Вывод: PHP-скрипт
<?php
$numbers = ["one", "two", "three"];
$byFirstLetter = [];
// ключ — первая буква; более позднее слово заменяет более раннее
foreach ($numbers as $word) {
$byFirstLetter[strtoupper($word[0])] = $word;
}
echo json_encode($byFirstLetter) . "\n";
Вычисление и ключа, и значения
Из элемента можно вычислить и ключ, и значение. Здесь ключ — первая буква, а значение — длина слова. Снова побеждает более поздний элемент с ключом T.
Вывод: PHP-скрипт
<?php
$numbers = ["one", "two", "three"];
$lengthByLetter = [];
// ключ — первая буква, значение — длина слова
foreach ($numbers as $word) {
$lengthByLetter[strtoupper($word[0])] = strlen($word);
}
echo json_encode($lengthByLetter) . "\n";
Ключ и значение из одного элемента
Иногда один элемент несёт обе части. explode разбивает полное имя по пробелу в массив слов, а присваивание списку [$first, $last] = ... распаковывает его. Фамилия становится ключом, а имя — значением.
Вывод: PHP-скрипт
<?php
$names = ["Alice Adams", "Brian Brown"];
$byLastName = [];
foreach ($names as $fullName) {
[$first, $last] = explode(" ", $fullName); // разбиваем по пробелу
$byLastName[$last] = $first; // фамилия -> имя
}
echo json_encode($byLastName) . "\n";
Flatten
Flatten превращает вложенную коллекцию, например массив массивов, в один плоский массив со всеми элементами по порядку.
В PHP array_merge соединяет любое количество массивов, а три точки распаковывают внутренние массивы в вызов: array_merge(...$nested).
Уплощение массива массивов
Три точки превращают array_merge(...$numberSets) в array_merge([1, 2, 3], [4, 5, 6]). Два внутренних массива по три числа становятся одним массивом из шести.
Вывод: PHP-скрипт
<?php
$numberSets = [[1, 2, 3], [4, 5, 6]];
// три точки распаковывают внутренние массивы в array_merge
$result = array_merge(...$numberSets);
echo implode(", ", $result) . "\n";
Уплощение значений из объектов
Flat map сначала берёт массив из каждого элемента, а затем соединяет все эти массивы вместе. array_map читает свойство $values каждого контейнера, а array_merge с тремя точками склеивает три массива в один.
Вывод: PHP-скрипт
<?php
declare(strict_types=1);
class Container {
public function __construct(public array $values) {}
}
$containers = [
new Container(["one", "two", "three"]),
new Container(["four", "five"]),
new Container(["six", "seven", "eight"]),
];
// сначала сопоставляем каждому контейнеру его значения, затем соединяем все эти массивы
$result = array_merge(...array_map(fn($c) => $c->values, $containers));
echo implode(", ", $result) . "\n";
Строковое представление
Часто коллекцию нужно показать как читаемый текст, например с запятыми между элементами.
В PHP implode принимает разделитель и массив и возвращает одну строку. Числа превращаются в текст автоматически. Дополнения — префикс, постфикс, ограничение или преобразование — делаются конкатенацией строк, с помощью array_slice или array_map перед соединением.
Соединение с разделителем
implode ставит ", " между словами и возвращает одну строку.
Вывод: PHP-скрипт
<?php
$numbers = ["one", "two", "three"];
echo implode(", ", $numbers) . "\n";
Добавление префикса и постфикса
Префикс и постфикс — это просто текст вокруг соединённого результата. В PHP их добавляют оператором ..
Вывод: PHP-скрипт
<?php
$numbers = ["one", "two", "three"];
// добавляем префикс и постфикс вокруг соединённого текста
$text = "start: " . implode(" | ", $numbers) . ": end";
echo $text . "\n";
Ограничение числа элементов
Для длинного массива может понадобиться показать только несколько первых элементов. range(1, 100) строит числа, array_slice($numbers, 0, 10) берёт первые 10, а "...>" добавляется в конец, чтобы показать, что остальные элементы отброшены. implode сам превращает числа в текст.
Вывод: PHP-скрипт
<?php
$numbers = range(1, 100);
// берём только первые 10 чисел
$limit = 10;
$parts = array_slice($numbers, 0, $limit);
if (count($numbers) > $limit) {
$parts[] = "<...>";
}
echo implode(", ", $parts) . "\n";
Преобразование каждого элемента перед соединением
Чтобы изменить каждый элемент перед соединением, сначала преобразуйте массив с помощью array_map, а затем примените implode к результату. Здесь каждое слово становится "Element: " плюс само слово в верхнем регистре.
Вывод: PHP-скрипт
<?php
$numbers = ["one", "two", "three"];
// сначала изменяем каждое слово, затем соединяем результаты
$parts = array_map(fn($word) => "Element: " . strtoupper($word), $numbers);
echo implode(", ", $parts) . "\n";