Массивы в 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() объединяет два или более массива в новый. Обратите внимание на то, как обрабатываются ключи: целочисленные ключи перенумеровываются, а строковые ключи конфликтуют — значение из более позднего массива перезаписывает значение из более раннего при совпадении строкового ключа.
Вывод:
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. Далее углубитесь в изучение индексированных массивов, ассоциативных массивов и сортировки массивов.