Функции для массивов
Многие задачи с массивами повторяются: преобразовать каждый элемент, отобрать подходящие, посчитать итог. Для них в PHP есть готовые функции — код с ними короче, чем цикл, и сразу видно, что он делает.
array_map
array_map() применяет функцию к каждому элементу и возвращает новый массив:
<?php
$prices = [100, 250, 400];
$withTax = array_map(fn ($price) => $price * 1.2, $prices);
echo implode(', ', $withTax); // 120, 300, 480Первым аргументом идёт функция, вторым — массив.
array_filter
array_filter() оставляет элементы, для которых функция вернула true:
<?php
$numbers = [5, 12, 8, 20];
$big = array_filter($numbers, fn ($number) => $number > 10);
echo implode(', ', $big); // 12, 20Здесь порядок аргументов обратный: сначала массив, потом функция.
array_reduce
array_reduce() сводит массив к одному значению. Функция получает накопленный результат и очередной элемент:
<?php
$cart = [100, 250, 400];
$total = array_reduce($cart, fn ($sum, $price) => $sum + $price, 0);
echo $total; // 750Третий аргумент — начальное значение. Для простой суммы есть готовая array_sum().
Цепочка преобразований
Функции можно соединять: результат одной передаётся в другую:
<?php
$orders = [
['total' => 500, 'paid' => true],
['total' => 300, 'paid' => false],
['total' => 200, 'paid' => true],
];
$paid = array_filter($orders, fn ($order) => $order['paid']);
$totals = array_column($paid, 'total');
echo array_sum($totals); // 700array_column() достаёт из массива массивов значения одного ключа.
Поиск
<?php
$fruits = ['яблоко', 'груша', 'слива'];
var_dump(in_array('груша', $fruits)); // bool(true)
echo array_search('слива', $fruits); // 2in_array() отвечает, есть ли значение, а array_search() возвращает его ключ или false.
Части массива
<?php
$numbers = [1, 2, 3, 4, 5];
echo implode(', ', array_slice($numbers, 1, 3)), "\n"; // 2, 3, 4
echo implode(', ', array_merge([1, 2], [3, 4])), "\n"; // 1, 2, 3, 4
echo implode(', ', array_unique([1, 2, 2, 3, 1])), "\n"; // 1, 2, 3
echo implode(', ', array_reverse($numbers)); // 5, 4, 3, 2, 1Все эти функции возвращают новый массив и не меняют исходный.
Частая ошибка
array_filter() сохраняет исходные ключи, поэтому в результате появляются «дыры» в нумерации. Обращение по индексу 0 может не сработать:
<?php
$numbers = [5, 12, 8, 20];
$big = array_filter($numbers, fn ($number) => $number > 10);
echo implode(', ', array_keys($big)), "\n"; // 1, 3
$big = array_values($big);
echo $big[0]; // 12array_values() перенумеровывает массив с нуля.