Функции массивов PHP: подробное руководство
Массивы в PHP — фундаментальная структура данных. Узнайте, как создавать, перебирать и обрабатывать массивы с помощью встроенных функций.
Массив в PHP — это одна переменная, которая хранит набор значений. Вместо того чтобы объявлять $user1, $user2, $user3, вы помещаете их все в один массив и обращаетесь к ним по индексу (числу) или ключу (имени). Массивы — один из наиболее часто используемых строительных блоков PHP: данные запросов ($_POST, $_GET), строки из базы данных и конфигурация — всё это передаётся вам в виде массивов.
В этой главе объясняются три вида массивов PHP, способы их создания и чтения, перебор элементов и наиболее часто используемые встроенные функции.
Три вида массивов
Внутри PHP есть один тип массива, но на практике он используется тремя разными способами:
| Вид | Ключи | Типичное применение |
|---|---|---|
| Индексированный | Автоматические целые числа 0, 1, 2… | Упорядоченный список элементов |
| Ассоциативный | Строки по вашему выбору | Запись с именованными полями |
| Многомерный | Массивы, вложенные в массивы | Таблицы, сгруппированные данные |
Создание массивов
Современный короткий синтаксис использует квадратные скобки []; более старая форма array() равнозначна и по-прежнему работает.
<?php
// Indexed array — keys 0, 1, 2 are assigned automatically
$fruits = ["apple", "banana", "cherry"];
// Associative array — you choose the keys
$user = [
"name" => "Ada",
"email" => "[email protected]",
"admin" => true,
];
echo $fruits[0]; // apple
echo $user["name"]; // AdaДобавляйте элементы в массив с помощью синтаксиса с пустыми скобками — он добавляет значение в конец:
<?php
$fruits = ["apple", "banana"];
$fruits[] = "cherry"; // index 2
$fruits[] = "date"; // index 3
print_r($fruits);
// Array ( [0] => apple [1] => banana [2] => cherry [3] => date )Используйте
indexed arrays,associative arraysиmultidimensional arraysдля более подробного изучения каждого вида.
Перебор массива
Цикл foreach — идиоматический способ перебора массива, поскольку он даёт ключ и значение напрямую без ручного отслеживания индексов:
<?php
$user = ["name" => "Ada", "email" => "[email protected]"];
foreach ($user as $key => $value) {
echo "$key: $value\n";
}
// name: Ada
// email: [email protected]Подробный синтаксис, включая перебор по ссылке, описан в главе foreach loop.
Как работают функции массивов
PHP поставляется с сотнями функций для работы с массивами — готовыми помощниками, выполняющими конкретную операцию, чтобы вам не приходилось писать цикл самостоятельно. Важно понимать: большинство из них возвращают новый массив и не изменяют исходный (array_map, array_filter, array_merge…), тогда как меньшая группа изменяет массив на месте и возвращает что-то другое (sort возвращает true, array_push — новую длину). Понимание этого различия помогает избежать целого класса ошибок.
Функцию вызывают, передавая массив в качестве аргумента. Например, array_sum складывает все значения:
Наиболее используемые функции
| Функция | Что делает | Изменяет массив? |
|---|---|---|
count() | Количество элементов | нет |
in_array() | Есть ли значение в массиве? | нет |
array_keys() | Все ключи в виде массива | нет |
array_values() | Все значения, переиндексированные с 0 | нет |
array_merge() | Объединяет два или более массивов | нет |
array_slice() | Извлекает часть массива | нет |
array_unique() | Удаляет повторяющиеся значения | нет |
array_push() | Добавляет одно или несколько значений | да |
sort() | Сортирует значения по возрастанию | да |
Ниже рассмотрены три ключевые функции с callback-аргументом — map, filter и reduce, — которые охватывают большинство задач преобразования данных.
array_map — преобразование каждого элемента
array_map применяет callback к каждому значению и возвращает новый массив результатов той же длины, что и исходный:
<?php
$numbers = [1, 2, 3, 4];
$squared = array_map(fn($n) => $n * $n, $numbers);
print_r($squared);
// Array ( [0] => 1 [1] => 4 [2] => 9 [3] => 16 )array_filter — сохранение только подходящих элементов
array_filter оставляет элементы, для которых callback возвращает true. Обратите внимание: функция сохраняет исходные ключи, поэтому после неё часто применяют array_values() для переиндексации:
<?php
$numbers = [1, 2, 3, 4, 5, 6];
$even = array_filter($numbers, fn($n) => $n % 2 === 0);
print_r($even);
// Array ( [1] => 2 [3] => 4 [5] => 6 ) ← keys kept
print_r(array_values($even));
// Array ( [0] => 2 [1] => 4 [2] => 6 ) ← re-indexedarray_reduce — свёртка к одному значению
array_reduce применяет callback с аккумулятором ($carry) ко всему массиву, сводя его к одному результату — сумме, строке, максимуму или чему угодно:
Полная информация доступна в главах array_map, array_filter и array_reduce, а также в главе PHP callback functions о том, как работают callback-функции.
Типичные ошибки
array_filterсохраняет ключи. Как показано выше, результат больше не имеет индексов0, 1, 2…. Оберните его вarray_values(), когда нужен чистый список.array_mergeперенумеровывает целочисленные ключи, но перезаписывает строковые.array_merge(["a" => 1], ["a" => 2])даёт["a" => 2], тогда как два индексированных массива конкатенируются, а не перезаписываются.- Изменение vs. возврат.
sort($arr)изменяет$arrи возвращаетtrue— запись$arr = sort($arr)является классической ошибкой, которая присваивает$arrзначениеtrue. - Обращение к несуществующему ключу вызывает предупреждение и возвращает
null. Предварительно проверяйте с помощьюisset()илиarray_key_exists().
Заключение
Массивы PHP бывают трёх видов — индексированные, ассоциативные и многомерные — и для их запроса, преобразования и объединения существует обширная библиотека функций. Используйте foreach для перебора, array_map / array_filter / array_reduce для преобразования данных и всегда помните о различии между изменением на месте и возвратом, чтобы избежать неожиданных результатов. Для дальнейшего изучения обратитесь к главам sorting arrays и PHP functions.