W3docs

Функции массивов 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 складывает все значения:

php— editable, runs on the server

Наиболее используемые функции

ФункцияЧто делаетИзменяет массив?
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-indexed

array_reduce — свёртка к одному значению

array_reduce применяет callback с аккумулятором ($carry) ко всему массиву, сводя его к одному результату — сумме, строке, максимуму или чему угодно:

php— editable, runs on the server

Полная информация доступна в главах 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.

Практика

Практика
Какие утверждения об массивах в PHP верны?
Какие утверждения об массивах в PHP верны?
Was this page helpful?