Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Функции для массивов

Многие задачи с массивами повторяются: преобразовать каждый элемент, отобрать подходящие, посчитать итог. Для них в 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); // 700

array_column() достаёт из массива массивов значения одного ключа.

Поиск

<?php
 
$fruits = ['яблоко', 'груша', 'слива'];
 
var_dump(in_array('груша', $fruits));   // bool(true)
echo array_search('слива', $fruits);    // 2

in_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]; // 12

array_values() перенумеровывает массив с нуля.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.