Работа с массивами в PHP

В этой статье вы изучите массивы в PHP, научитесь создавать, перебирать и выводить их, познакомитесь с множеством различных функций для работы с ними.
Что такое массив? Создание массива
Массив – это тип данных для хранения упорядоченного набора элементов. Каждый элемент в массиве состоит из ключа и значения.
В PHP имеются только упорядоченные ассоциативные массивы. Индексированных массивов в PHP нет.
Но тем не менее в PHP мы можем создавать простые массивы. При указании значений без ключей, они будут им присваиваться автоматически.
Например, создадим массив, который будет содержать среднюю температуру каждого месяца в году:
<?php
// создадим массив, состоящий из 12 чисел
$temperatures = [-15, -9, 3, 10, 17, 23, 24, 26, 17, 8, -4, -11];
// получим тип переменной $temperatures
echo gettype($temperatures); // "array"
Здесь мы создали массив $temperatures, содержащий 12 значений. Каждый элемент в этом массиве имеет ключ. Первый элемент имеет в качестве ключа число 0, второй – число 1, и так далее. Последний элемент имеет в качестве ключа число 11.
Другой вариант создания массивов – это использовать функцию array()
:
<?php
$temperatures = array(-15, -9, 3, 10, 17, 23, 24, 26, 17, 8, -4, -11);
Создание массива без элементов, то есть пустого массива, в PHP выполняется так:
<?php
$empty1 = [];
$empty2 = array();
Обращение к значению массива выполняется посредством ключа, который указывается в квадратных скобках:
<?php
$temperatures = [-15, -9, 3, 10, 17, 23, 24, 26, 17, 8, -4, -11];
// средняя температура марта
echo $temperatures[2]; // 3
// средняя температура августа
echo $temperatures[7]; // 26
В квадратных скобках при необходимости можно указывать выражение, результат вычисления которого будет использоваться в качестве ключа элемента, значение которого нужно получить:
<?php
$temperatures = [-15, -9, 3, 10, 17, 23, 24, 26, 17, 8, -4, -11];
// выведем среднюю температуру по номеру текущего месяца, но так как нумерация ключей в массиве начинается с 0, то отнимем ещё 1
echo $temperatures[date('n') - 1];
Если мы попытаемся обратиться к элементу, которого нет в массиве, то начиная с PHP 8.0.0, мы получим сообщение об ошибке E_WARNING
. При этом в качестве значение будет возвращено null
.
<?php
$fruits = ['apple', 'banana', 'pear'];
echo $fruits[3]; // null
Проверить наличия некоторого ключа в массиве можно с помощью функции array_key_exists
:
<?php
$fruits = ['apple', 'banana', 'pear'];
$key = 1;
if (array_key_exists($key, $fruits)) {
echo "Ключ '$key' имеется в массиве";
} else {
echo "Ключа '$key' нет в массиве";
}
Добавление в массив нового элемента или изменение существующего осуществляется в PHP так:
<?php
$fruits = ['apple', 'banana', 'pear'];
$fruits[1] = 'lemon';
print_r($fruits); // ['apple', 'lemon', 'pear']
$fruits[] = 'mango'; // это тоже самое, что $fruits[3] = 'mango';
print_r($fruits); // ['apple', 'lemon', 'pear', 'mango']
Здесь мы при добавлении нового элемента в массив не указали ему ключ. В этом случае ключ будет на единицу больше самого большого числового ключа в массиве.
Удаление элемента массива в PHP выполняется с помощью специальной языковой конструкции unset
:
<?php
$fruits = ['apple', 'banana', 'pear'];
unset($fruits[0]);
print_r($fruits); // ['banana', 'pear']
С помощью unset
вы можете удалить не только отдельный элемент, но и полностью весь массив:
<?php
unset($fruits);
if (!isset($fruits)) {
echo 'Переменная $fruits не определена.';
}
В PHP массиве могут содержаться данные различных типов:
<?php
$values = [null, 'three', 7, 'seven', true];
Вывод содержимого массива
Вывести все значения массива на экран можно с помощью функции print_r
:
<?php
$fruits = ['apple', 'banana', 'pear'];
print_r($fruits);
Но чтобы этот вывод был более наглядным лучше это делать внутри тега <pre>
:
<?php
$fruits = ['apple', 'banana', 'pear'];
echo '<pre>';
print_r($fruits);
echo '</pre>';

Ассоциативные массивы
Создание ассоциативных массивов в PHP выполняется с указанием ключа. При этом в качестве ключа могут использоваться как числа, так и строки:
<?php
$languages = [
'en' => 'English',
'fr' => 'French',
'es' => 'Spanish',
'pt' => 'Portuguese'
];
echo $languages['es']; // 'Spanish'
При этом в PHP выполняются следующие преобразования при сохранении ключей:
- строка
'7'
будет преобразована в число7
; но например ключ'07'
не будет преобразован, так как он не является корректным числом; - число
7.5
, то есть число с плавающей точкой (float
) будет преобразовано к целому числу, в данном случае к7
; true
к1
, аfalse
к0
;- значение
null
к пустой строке''
.
<?php
$arr = [
'95' => 'a',
'095' => 'b',
9.5 => 'c',
true => 'd',
null => 'e',
];
echo $arr[95]; // a
echo $arr['095']; // b
echo $arr[9]; // c
echo $arr[1]; // d
echo $arr['']; // e
Если несколько элементов в объявлении массива используют одинаковый ключ, то последний перезапишет предыдущие:
<?php
$array = [
0 => 'a',
'0' => 'b',
0.7 => 'c',
false => 'd',
];
echo '<pre>';
print_r($array);
echo '</pre>';
Так как в этом примере все ключи преобразуются к 0
, то каждый следующий элемент будет перезаписывать предыдущий и останется в массиве только один ключ со значением 'd'
.

В одном массиве могут содержаться ключи различных типов, то есть одновременно int
и string
:
<?php
$numbers = [
1 => 'one',
'b' => 'two',
];
Перебор массивов
Наиболее удобный способ прохождения по массиву в PHP – это использовать конструкцию foreach
:
<?php
$languages = [
'en' => 'English',
'fr' => 'French',
'es' => 'Spanish',
'pt' => 'Portuguese',
];
/*
$languages – массив, который нужно перебрать
$key – значение ключа
$value – значение, соответствующее ключу
*/
echo '<pre>';
foreach ($languages as $key => $value) {
echo "Ключ '$key' имеет значение '$value'<br>";
}
echo '</pre>';
Если нужно только по значениям:
foreach ($languages as $value) {
echo "$value
";
}
Если ключи массива составляют последовательность, то перебрать такой массив можно с помощью for
:
<?php
$temperatures = [-15, -9, 3, 10, 17, 23, 24, 26, 17, 8, -4, -11];
for ($i = 0; $i < count($temperatures); $i++) {
echo $temperatures[$i] . '
';
}
Здесь мы с помощью встроенной функции count()
получить длину или другими словами размер массива. Узнать длину массива также можно с помощью sizeof()
.
<?php
$temperatures = [-15, -9, 3, 10, 17, 23, 24, 26, 17, 8, -4, -11];
echo sizeof($temperatures); // 12
Функцию count
также можно использовать для получения последнего элемента массива. Но это повторим только возможно если ключи массива составляют числовую последовательность, начинающуюся с 0
.
<?php
$animals = ['horses', 'dogs', 'birds'];
echo $animals[count($animals) - 1]; // birds
Функции для работы с массивами
В PHP очень много различных функций для работы с массивами. Рассмотрим некоторые из них.
Сортировка
Сортировка массива в порядке возрастания осуществляется с помощью функции sort
, в порядке убывания посредством rsort
.
<?php
$fruits = ['lemon', 'orange', 'banana', 'apple'];
sort($fruits); // ['apple', 'banana', 'lemon', 'orange']
Для настройки сортировки можно передать в качестве второго аргумента флаг.
Например:
<?php
$arr = ['10', 11, 100, 'a'];
sort($arr); // ['10', 11, 100, 'a']
sort($arr, SORT_STRING); // ['10', 100, 11, 'a']
sort($arr, SORT_NUMERIC); // ['a', '10', 11, 100]
Для того чтобы ключи сохранили значения, с которыми они связаны, сортировку массива необходимо выполнять с помощью функции asort
. Функция asort
сортирует в порядке возрастания, для сортировки в порядке убывания используйте arsort
. Эти функции сортируют массив соответственно как sort
и rsort
, но ключи в отличие от них остаются связанными с такими же значениями.
Например, выведем с помощью ассоциативного массива $students
имя студента и соответствующий полученный им балл в порядке их возрастания:
<?php
$students = [
'John' => 47,
'Bob' => 24,
'Tom' => 36,
];
asort($students);
echo '<pre>';
print_r($students);
echo '</pre>';

Массивы в PHP можно сортировать не только по значениям, но и ключам. Для этого используется функция ksort
. Для ассоциативного массива $students
функция ksort
выстроит все элементы в порядке возрастания названий ключей.
<?php
$students = [
'John' => 47,
'Bob' => 24,
'Tom' => 36,
];
ksort($students); // ['Bob' => 24, 'John' => 47, 'Tom' => 36]
Для сортировки в порядке убывания можно использовать krsort
:
krsort($students); // ['Tom' => 36, 'John' => 47, 'Bob' => 24]
Перемешивание элементов случайным образом
Если вам нужно перемешать элементы в массиве случайным образом, то можно воспользоваться функцией shuffle
:
<?php
$languages = [
'en' => 'English',
'fr' => 'French',
'es' => 'Spanish',
'pt' => 'Portuguese',
];
shuffle($languages); // ['Portuguese', 'French', 'Spanish', 'English']
shuffle($languages); // ['English', 'French', 'Spanish', 'Portuguese']
При этом как вы видите, изначальные ключи теряются и массив превращается в индексируемый.
Выстраивание элементов в обратном порядке
Если вам необходимо создать новый массив, в котором элементы нужно выстроить в обратном порядке, то используйте array_reverse
:
<?php
$languages = [
'en' => 'English',
'fr' => 'French',
'es' => 'Spanish',
'pt' => 'Portuguese',
];
$languagesReverse = array_reverse($languages);
echo '<pre>';
print_r($languagesReverse);
echo '</pre>';

Работа над массивами как с множествами значений
В PHP имеются функции: array_merge
, array_intersect
и array_diff
. Они позволяют работать с массивами как с множествами значений.
1. Объединение одного или несколько массивов вместе выполняется в PHP с помощью функции array_merge
:
array_merge(array ...$arrays): array
Например, объединим с помощью array_merge
элементы 3 массивов вместе:
<?php
$array1 = ['color' => 'red', 1, 'php', 4];
$array2 = ['price' => 20.8, 1, 'color' => 'green', 3];
$array3 = ['green', 'price' => 30.5, 3, 'php'];
$array = array_merge($array1, $array2, $array3);
echo '<pre>';
print_r($array);
echo '</pre>';

Если массивы имеют одинаковые строковые ключи, то более позднее значение этого ключа перезапишет предыдущее. Например, значение 'green'
ключа 'color'
перезапишет 'red'
.
Однако если массивы содержат числовые ключи, то более позднее значение не перезаписывает предыдущее, оно будет просто добавлено в массив. Значения с числовыми ключами в результирующем массиве будут перенумерованы последовательно начиная с нуля.
Функция array_merge
, вызванная без аргументов возвращает пустой массив:
<?php
$array = array_merge(); // []
2. Функция array_intersect
вычисляет пересечения значений основного массива со значениями других массивов:
// $base – основной массив
// $arrays – другие массивы
array_intersect(array $base, array ...$arrays): array
В качестве результата оно возвращает массив со значениями основного массива, которые имеются во всех других массивах.
Например:
<?php
$base = ['color' => 'red', 1, 'php', 4];
$array1 = ['price' => 20.8, 1, 'color' => 'red', 3];
$array2 = ['green', 'color' => 'red', 3, 'php', 1];
$result = array_intersect($base, $array1, $array2); // ['color' => red, 0 => 1]
3. Функция array_diff
вычисляет разницу между массивами:
// $base – основной массив
// $arrays – другие массивы
array_diff(array $base, array ...$arrays): array
В качестве результата оно возвращает массив со значениями основного массива, которых нет ни в одном из других массивов.
Например:
<?php
$base = ['color' => 'red', 1, 'php', 4];
$array1 = [3, 'color' => 'red'];
$array2 = [4, 'php'];
$result = array_diff($base, $array1, $array2); // [0 => 1]
Проверка наличия ключей и значений в массиве
Проверить имеется ли указанное значение в массиве можно с помощью функции in_array
:
if (in_array('apple', $fruits)) {
// значение 'apple' имеется в массиве $fruits
}
Здесь, в первый аргумент необходимо передать искомое значение, а во второй – сам массив. В качестве результата in_array
возвращает true
или false
.
Кроме in_array
в PHP имеется ещё функция array_search
. Она выполняет тоже самое, но в отличие от in_array
возвращает ключ этого значения.
Если нужно проверить наличие не значения, а ключа, то можно воспользоваться функцией array_key_exists
:
if (array_key_exists('es', $languages)) {
// ключ 'es' имеется в массиве $languages
}
Сериализация
Сериализация в PHP – это очень мощный механизм, позволяющий легко преобразовать массив в строку, которая будет содержать ключи и значения в структурированном формате. Полученные строки затем можно сохранять в файлы и базу данных.
Сериализация массива в строку выполняется с помощью функции serialize
. Для декодирования строки, содержащей сериализованный массив, обратно в исходный массив используется функция unserialize
:
// исходный массив
$person = [
'name' => 'Alexander',
'age' => 23
];
// сериализуем массив в строковое представление, уникальное для PHP
$personString = serialize($person);
// выведем на экран строку
echo $personString; // 'a:2:{s:4:"name";s:9:"Alexander";s:3:"age";i:23;}'
// преобразуем строку обратно в массив
$personArray = unserialize($personString);
// выведем на экран массив в форматированном виде
echo '<pre>';
print_r($personArray); // array('name' => Alexander, 'age' => 23)
echo '</pre>';
Многомерные массивы
Многомерные массивы – это массивы, элементы которого просто содержат другие массивы.
Пример создания двумерного массива:
$software = [
'os' => ['Windows', 'Linux', 'macOS'],
'browsers' => ['Firefox', 'Chrome', 'Safari', 'Edge'],
'code editors' => ['Visual Studio Code', 'Atom', 'Sublime Text'],
];
По сути двумерный массив – это массив массивов. Обращение к элементу массива в этом случае осуществляется с использованием двух квадратных скобок:
echo $software['os'][0]; // 'Windows'
$software['browsers'][3] = 'Opera';
Выведем с помощью функции print_r
массив $software
в форматированном виде:
echo '<pre>';
print_r($software);
echo '</pre>';
