W3docs

Массивы в PHP

Массивы PHP хранят коллекции значений по ключу. Узнайте про индексированные, ассоциативные и многомерные массивы с примерами кода.

Массив PHP — это упорядоченная карта: одна переменная, хранящая множество значений, каждое из которых доступно по ключу. Вместо того чтобы объявлять $fruit1, $fruit2, $fruit3, достаточно завести один массив $fruits и обращаться к его элементам по позиции или по имени. Массивы — основная структура данных в PHP: результаты запросов, данные форм ($_POST), конфигурация и JSON — всё это поступает в виде массивов.

В этой главе рассмотрены три вида массивов, способы их создания и чтения, добавление, удаление и объединение элементов, перебор в цикле и типичные ошибки, с которыми сталкиваются новички. Каждый запускаемый пример выводит результат, чтобы вы могли увидеть, что именно возвращает PHP.

Типы массивов PHP

В PHP существуют три формы массивов, которые внутренне представляют собой один и тот же тип — упорядоченную карту пар «ключ/значение»:

  • Индексированные массивы используют автоматические целочисленные ключи, начиная с 0.
  • Ассоциативные массивы используют строковые ключи, которые вы задаёте сами.
  • Многомерные массивы хранят другие массивы в качестве значений, позволяя строить таблицы и вложенные структуры.
// Indexed: keys 0, 1, 2 are assigned automatically
$fruits = ["apple", "banana", "cherry"];

// Associative: you pick the keys
$colors = ["apple" => "red", "banana" => "yellow", "cherry" => "dark red"];

// Multidimensional: values are themselves arrays
$basket = [
    ["name" => "apple",  "qty" => 4],
    ["name" => "banana", "qty" => 6],
];

Каждая форма имеет собственную главу: индексированные массивы, ассоциативные массивы и многомерные массивы.

Создание массивов PHP

Существует два равнозначных синтаксиса. Короткий синтаксис [] (PHP 5.4+) предпочтителен в современном коде; более старая функция array() делает ровно то же самое.

// Short array syntax — recommended
$fruits = ["apple", "banana", "cherry"];

// Long syntax with the array() language construct
$fruits = array("apple", "banana", "cherry");

Массив также можно строить постепенно. Присваивание $arr[] добавляет элемент со следующим целочисленным ключом, а присваивание по именованному ключу создаёт или перезаписывает соответствующий элемент:

$fruits = [];
$fruits[] = "apple";     // key 0
$fruits[] = "banana";    // key 1
$fruits["best"] = "fig"; // string key "best"

Доступ к элементам массива

Читайте значение с помощью [], передавая целочисленный индекс для индексированных массивов или строковый ключ для ассоциативных.

<?php
$fruits = ["apple", "banana", "cherry"];
$colors = ["apple" => "red", "banana" => "yellow"];

echo $fruits[0];        // apple
echo "\n";
echo $colors["apple"];  // red
?>

Обращение к несуществующему ключу генерирует предупреждение и возвращает null. Сначала проверьте с помощью isset() (возвращает true только когда ключ существует и не равен null) или array_key_exists() (возвращает true даже если хранимое значение равно null), или задайте запасное значение с помощью оператора объединения с null:

<?php
$colors = ["apple" => "red"];

$banana = $colors["banana"] ?? "unknown"; // no warning, returns "unknown"
echo $banana;
?>

Добавление и удаление элементов

PHP предоставляет специализированные функции для изменения массива с любого конца:

  • array_push($arr, $value) — добавить в конец (или просто используйте $arr[] = $value).
  • array_pop($arr) — удалить и вернуть последний элемент.
  • array_unshift($arr, $value) — добавить в начало.
  • array_shift($arr) — удалить и вернуть первый элемент, переиндексировав остальные.
  • unset($arr[$key]) — удалить конкретный элемент (в целочисленных ключах образуется «дыра»).
<?php
$fruits = ["apple", "banana", "cherry"];

array_push($fruits, "mango"); // ["apple","banana","cherry","mango"]
$last = array_pop($fruits);   // $last = "mango"
unset($fruits[1]);            // removes "banana", keys 0 and 2 remain

print_r($fruits);
?>

Вывод:

Array
(
    [0] => apple
    [2] => cherry
)

Обратите внимание на отсутствующий [1]unset() не перенумеровывает ключи. Чтобы привести ключи к виду 0, 1, 2…, выполните array_values($fruits). Подробнее смотрите в главах array_push и array_pop.

Перебор массивов в цикле

foreach — идиоматический способ обхода массива; он работает как для индексированных, так и для ассоциативных массивов и предоставляет одновременно ключ и значение.

<?php
$colors = ["apple" => "red", "banana" => "yellow", "cherry" => "dark red"];

foreach ($colors as $fruit => $color) {
    echo "$fruit is $color\n";
}
?>

Вывод:

apple is red
banana is yellow
cherry is dark red

Подробнее см. главу цикл foreach и общий обзор циклов PHP.

Объединение массивов

array_merge() объединяет два или более массива в новый. Обратите внимание на то, как обрабатываются ключи: целочисленные ключи перенумеровываются, а строковые ключи конфликтуют — значение из более позднего массива перезаписывает значение из более раннего при совпадении строкового ключа.

php— editable, runs on the server

Вывод:

Array
(
    [0] => apple
    [1] => banana
    [2] => cherry
    [3] => mango
)

Если нужно просто дополнить нумерованные массивы, лаконичной альтернативой служит оператор расширения: $all = [...$fruits1, ...$fruits2];. Для слияния с строковыми ключами, где приоритет должен быть у первого значения, используйте вместо этого оператор объединения +. Подробнее в главе array_merge.

Полезные вспомогательные функции

В стандартной библиотеке PHP есть десятки функций для работы с массивами. Вот те, к которым вы будете обращаться постоянно:

ФункцияЧто делает
count($arr)Количество элементов
in_array($v, $arr)Проверяет наличие значения (подробнее)
array_keys($arr)Все ключи в виде нового массива (подробнее)
array_values($arr)Все значения, переиндексированные с 0
sort($arr)Сортировать значения на месте (сортировка массивов)
<?php
$fruits = ["apple", "banana", "cherry"];

echo count($fruits);                              // 3
echo "\n";
echo in_array("banana", $fruits) ? "yes" : "no";  // yes
?>

Типичные ошибки

  • Ключи уникальны. Присваивание по существующему ключу перезаписывает его, а не добавляет второй элемент.
  • "1" и 1 совпадают. Числовые строковые ключи приводятся к целым числам, поэтому $a["1"] и $a[1] — это один и тот же слот.
  • Массивы копируются по значению. Передача массива в функцию даёт ей копию; оригинал остаётся неизменным, если только вы не передаёте его по ссылке (&$arr).
  • unset() оставляет «дыры». Используйте array_values() после удаления, если вам нужен чистый последовательный индекс.

Заключение

Массивы PHP — основа для хранения и организации данных: от простого списка значений до вложенных записей. Освойте три формы, операции создания/чтения/добавления/удаления, цикл foreach и несколько вспомогательных функций — и вы сможете решить большинство реальных задач работы с данными в PHP. Далее углубитесь в изучение индексированных массивов, ассоциативных массивов и сортировки массивов.

Практика

Практика
Какие типы массивов существуют в PHP?
Какие типы массивов существуют в PHP?
Was this page helpful?