Эффективная работа с массивами: PHP функции и приёмы
Основные функции для обработки массивов
Как применить функцию к каждому элементу массива?
Самым эффективным и лаконичным способом является использование array_map. Она возвращает новый массив, применяя callback к каждому элементу.
$numbers = [1, 2, 3, 4];
$doubled = array_map(function($n) { return $n * 2; }, $numbers);
// $doubled: [2, 4, 6, 8]Php ключи массива (получение ключей массива в php)
Array ( [0] => 2 [1] => 4 [2] => 6 [3] => 8 )
Php массивы индексы (получение индексов массива в php)
Цель: быстрое преобразование всех элементов без изменения исходного массива.
Вариант 1: использование именованной функции.
function multiply($n) { return $n * 2; }
$doubled = array_map('multiply', $numbers);
массив данных php (работа с массивом данных в php)
Вариант 2: передача нескольких массивов для поэлементной обработки.
$a = [1, 2]; $b = [10, 20];
$sum = array_map(function($x, $y) { return $x + $y; }, $a, $b);
// $sum: [11, 22]массив ли php (проверка, является ли переменная массивом в php)
Вариант 3: использование array_walk, если нужно изменять массив по ссылке и не возвращать новый.
$array = [1, 2, 3];
array_walk($array, function(&$v) { $v *= 2; });
// $array: [2, 4, 6]Php разбить массив (разбиение массива на части в php)
Цель вариантов: когда требуется повторное использование callback, работа с несколькими массивами, или модификация исходного массива без создания копии.
Типичные ошибки:
- Забыть, что array_map не изменяет исходный массив, а возвращает новый.
- При указании нескольких массивов они должны быть одинаковой длины, иначе результат будет до минимальной длины.
- Callback не может передавать элементы по ссылке, поэтому для модификации исходного массива подходит array_walk.
Как отфильтровать массив по заданному условию?
array_filter - основное решение для фильтрации. Без callback удаляет значения, равные false.
$array = [0, 'text', '', null, false, 5];
$filtered = array_filter($array);
// $filtered: [1 => 'text', 5 => 5]Php переменные массив (создание массива из переменных в php)
Array ( [1] => text [5] => 5 )
Php сортировка массива (сортировка массива в php)
Цель: простейшая очистка от пустых значений.
Вариант 1: фильтрация с пользовательским callback.
$numbers = [1, 2, 3, 4, 5];
$even = array_filter($numbers, function($v) { return $v % 2 == 0; });
// $even: [1 => 2, 3 => 4]ассоциативный массив php (ассоциативные массивы в php)
Вариант 2: фильтрация по ключам с использованием флага ARRAY_FILTER_USE_KEY.
$array = ['a' => 1, 'b' => 2, 'c' => 3];
$filtered = array_filter($array, function($k) { return $k != 'b'; }, ARRAY_FILTER_USE_KEY);
// $filtered: ['a' => 1, 'c' => 3]Php удалить массива (удаление всего массива в php)
Вариант 3: фильтрация с помощью array_intersect для нахождения общих значений двух массивов.
$source = [1, 2, 3, 4];
$allowed = [2, 4];
$result = array_intersect($source, $allowed);
// $result: [1 => 2, 3 => 4]функции массива php (функции для работы с массивами в php)
Цель вариантов: гибкая фильтрация по значениям, ключам или пересечению множеств.
Типичные ошибки:
- По умолчанию array_filter сохраняет ключи, что может привести к разрыву индексации. Используйте array_values для переиндексации.
- Если callback возвращает не логическое значение, а, например, число, оно приводится к bool, что может быть неочевидно.
Как отсортировать массив по значениям или ключам?
sort() - простейшая сортировка по возрастанию значений, сбрасывает ключи.
$colors = ['red', 'green', 'blue'];
sort($colors);
// $colors: ['blue', 'green', 'red']Php удалить массив (удаление массива в php)
Array ( [0] => blue [1] => green [2] => red )
Php array keys (функция array_keys в php)
Цель: быстрая сортировка без сохранения исходных ключей.
Вариант 1: asort() - сортировка по значениям с сохранением ключей.
$ages = ['Peter' => 25, 'Alice' => 30, 'John' => 20];
asort($ages);
// $ages: ['John' => 20, 'Peter' => 25, 'Alice' => 30]Php массив в строку (преобразование массива в строку php)
Array ( [John] => 20 [Peter] => 25 [Alice] => 30 )
Php key (ключи и массивы в php)
Вариант 2: ksort() - сортировка по ключам.
ksort($ages);
// $ages: ['Alice' => 30, 'John' => 20, 'Peter' => 25]
Вариант 3: usort() - пользовательская сортировка по заданному критерию.
$people = [['name'=>'John','age'=>25], ['name'=>'Alice','age'=>20]];
usort($people, function($a, $b) { return $a['age'] <=> $b['age']; });
// $people: [['name'=>'Alice','age'=>20], ['name'=>'John','age'=>25]]
Цель вариантов: сохранение ключей (asort, ksort) или сложные критерии (usort).
Типичные ошибки:
- sort, asort и другие изменяют исходный массив, а не возвращают новый.
- При usort важно корректно возвращать -1, 0, 1 (или использовать оператор <=>).
- Если массив содержит объекты, сортировка может привести к неожиданным результатам.
Как объединить несколько массивов в один?
array_merge() - универсальный способ слияния массивов. Числовые ключи перенумеровываются, строковые - перезаписываются.
$arr1 = [1, 2];
$arr2 = [3, 4];
$merged = array_merge($arr1, $arr2);
// $merged: [1, 2, 3, 4]
Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 )
Цель: объединение с переиндексацией и перезаписью строковых ключей.
Вариант 1: оператор + - сохраняет первые ключи, не перезаписывает.
$a = ['a' => 1, 'b' => 2];
$b = ['b' => 3, 'c' => 4];
$result = $a + $b;
// $result: ['a' => 1, 'b' => 2, 'c' => 4]
Вариант 2: array_replace() - заменяет значения из второго массива, но сохраняет числовые ключи.
$base = [1, 2, 3];
$replace = [0 => 10, 2 => 30];
$result = array_replace($base, $replace);
// $result: [10, 2, 30]
Цель вариантов: контроль перезаписи (оператор +) или частичная замена (array_replace).
Типичные ошибки:
- При array_merge строковые ключи перезаписываются без предупреждения.
- Оператор + не переиндексирует числовые ключи, что может привести к коллизиям.
- Для вложенных массивов array_merge не рекурсивен (используйте array_merge_recursive).
Дополнительные примеры и нестандартные сценарии
Преобразование многомерного массива с array_map и array_column
$users = [
['id' => 1, 'name' => 'John'],
['id' => 2, 'name' => 'Alice'],
];
$names = array_column($users, 'name');
// $names: ['John', 'Alice']
$users_with_email = array_map(function($user) {
$user['email'] = strtolower($user['name']).'@example.com';
return $user;
}, $users);
// $users_with_email: [['id'=>1,'name'=>'John','email'=>'john@example.com'], ...]
Array ( [0] => Array ( [id] => 1 [name] => John [email] => john@example.com ) [1] => Array ( [id] => 2 [name] => Alice [email] => alice@example.com ) )
Сведение массива с array_reduce для вычисления суммы, произведения или конкатенации
$numbers = [1, 2, 3, 4];
$sum = array_reduce($numbers, function($carry, $item) {
return $carry + $item;
}, 0);
// $sum = 10
$product = array_reduce($numbers, function($carry, $item) {
return $carry * $item;
}, 1);
// $product = 24
$words = ['Hello', ' ', 'World'];
$sentence = array_reduce($words, function($carry, $item) {
return $carry . $item;
}, '');
// $sentence = 'Hello World'
10 24 Hello World
Фильтрация и переиндексация с array_values
$mixed = [0, 'apple', '', 'banana', null];
$filtered = array_filter($mixed);
$indexed = array_values($filtered);
// $indexed: ['apple', 'banana']
Array ( [0] => apple [1] => banana )
Сортировка многомерного массива по нескольким полям с usort
$data = [
['name' => 'John', 'age' => 30],
['name' => 'Alice', 'age' => 25],
['name' => 'John', 'age' => 20],
];
usort($data, function($a, $b) {
$cmp = strcmp($a['name'], $b['name']);
if ($cmp == 0) {
return $a['age'] <=> $b['age'];
}
return $cmp;
});
// Сортировка по имени, затем по возрасту
// Результат: Alice(25), John(20), John(30)
Array ( [0] => Array ( [name] => Alice [age] => 25 ) [1] => Array ( [name] => John [age] => 20 ) [2] => Array ( [name] => John [age] => 30 ) )
Рекурсивное применение array_walk_recursive для многомерного массива
$nested = ['a' => [1, 2], 'b' => [3, [4, 5]]];
$result = [];
array_walk_recursive($nested, function($value, $key) use (&$result) {
$result[] = $value * 10;
});
// $result: [10, 20, 30, 40, 50]
Array ( [0] => 10 [1] => 20 [2] => 30 [3] => 40 [4] => 50 )
Использование array_diff и array_intersect для сравнения массивов
$a = [1, 2, 3, 4];
$b = [2, 4, 6];
$diff = array_diff($a, $b);
// $diff: [0 => 1, 2 => 3]
$intersect = array_intersect($a, $b);
// $intersect: [1 => 2, 3 => 4]
Array ( [0] => 1 [2] => 3 ) Array ( [1] => 2 [3] => 4 )