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

Работа с массивами в PHP
Содержание:
  1. Что такое массив? Создание массива
  2. Вывод содержимого массива
  3. Ассоциативные массивы
  4. Перебор массивов
  5. Функции для работы с массивами
  6. Многомерные массивы
  7. Комментарии

В этой статье вы изучите массивы в 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
<?php
$temperatures = array(-15, -9, 3, 10, 17, 23, 24, 26, 17, 8, -4, -11);

Создание массива без элементов, то есть пустого массива, в PHP выполняется так:

PHP
<?php
$empty1 = [];
$empty2 = array();

Обращение к значению массива выполняется посредством ключа, который указывается в квадратных скобках:

PHP
<?php
$temperatures = [-15, -9, 3, 10, 17, 23, 24, 26, 17, 8, -4, -11];
// средняя температура марта
echo $temperatures[2]; // 3
// средняя температура августа
echo $temperatures[7]; // 26

В квадратных скобках при необходимости можно указывать выражение, результат вычисления которого будет использоваться в качестве ключа элемента, значение которого нужно получить:

PHP
<?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
<?php
$fruits = ['apple', 'banana', 'pear'];
echo $fruits[3]; // null

Проверить наличия некоторого ключа в массиве можно с помощью функции array_key_exists:

PHP
<?php
$fruits = ['apple', 'banana', 'pear'];
$key = 1;
if (array_key_exists($key, $fruits)) {
  echo "Ключ '$key' имеется в массиве";
} else {
  echo "Ключа '$key' нет в массиве";
}

Добавление в массив нового элемента или изменение существующего осуществляется в PHP так:

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
<?php
$fruits = ['apple', 'banana', 'pear'];
unset($fruits[0]);
print_r($fruits); // ['banana', 'pear']

С помощью unset вы можете удалить не только отдельный элемент, но и полностью весь массив:

PHP
<?php
unset($fruits);
if (!isset($fruits)) {
  echo 'Переменная $fruits не определена.';
}

В PHP массиве могут содержаться данные различных типов:

PHP
<?php
$values = [null, 'three', 7, 'seven', true];

Вывод содержимого массива

Вывести все значения массива на экран можно с помощью функции print_r:

PHP
<?php
$fruits = ['apple', 'banana', 'pear'];
print_r($fruits);

Но чтобы этот вывод был более наглядным лучше это делать внутри тега <pre>:

PHP
<?php
$fruits = ['apple', 'banana', 'pear'];
echo '<pre>';
print_r($fruits);
echo '</pre>';
Вывод содержимого массива с помощью функции print_r в PHP

Ассоциативные массивы

Создание ассоциативных массивов в PHP выполняется с указанием ключа. При этом в качестве ключа могут использоваться как числа, так и строки:

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
<?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
<?php
$array = [
  0 => 'a',
  '0' => 'b',
  0.7 => 'c',
  false => 'd',
];
echo '<pre>';
print_r($array);
echo '</pre>';

Так как в этом примере все ключи преобразуются к 0, то каждый следующий элемент будет перезаписывать предыдущий и останется в массиве только один ключ со значением 'd'.

Массив в PHP, у которого элементы имеют одинаковые ключи

В одном массиве могут содержаться ключи различных типов, то есть одновременно int и string:

PHP
<?php
$numbers = [
  1 => 'one',
  'b' => 'two',
];

Перебор массивов

Наиболее удобный способ прохождения по массиву в PHP – это использовать конструкцию foreach:

PHP
<?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>';

Если нужно только по значениям:

PHP
foreach ($languages as $value) {
  echo "$value
"; }

Если ключи массива составляют последовательность, то перебрать такой массив можно с помощью for:

PHP
<?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
<?php
$temperatures = [-15, -9, 3, 10, 17, 23, 24, 26, 17, 8, -4, -11];
echo sizeof($temperatures); // 12

Функцию count также можно использовать для получения последнего элемента массива. Но это повторим только возможно если ключи массива составляют числовую последовательность, начинающуюся с 0.

PHP
<?php
$animals = ['horses', 'dogs', 'birds'];
echo $animals[count($animals) - 1]; // birds

Функции для работы с массивами

В PHP очень много различных функций для работы с массивами. Рассмотрим некоторые из них.

Сортировка

Сортировка массива в порядке возрастания осуществляется с помощью функции sort, в порядке убывания посредством rsort.

PHP
<?php
$fruits = ['lemon', 'orange', 'banana', 'apple'];
sort($fruits); // ['apple', 'banana', 'lemon', 'orange']

Для настройки сортировки можно передать в качестве второго аргумента флаг.

Например:

PHP
<?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
<?php
$students = [
  'John' => 47,
  'Bob' => 24,
  'Tom' => 36,
];
asort($students);
echo '<pre>';
print_r($students);
echo '</pre>';
Сортировка массива в PHP, у которого ключи сохранили значения, с которыми они связаны

Массивы в PHP можно сортировать не только по значениям, но и ключам. Для этого используется функция ksort. Для ассоциативного массива $students функция ksort выстроит все элементы в порядке возрастания названий ключей.

PHP
<?php
$students = [
  'John' => 47,
  'Bob' => 24,
  'Tom' => 36,
];
ksort($students); // ['Bob' => 24, 'John' => 47, 'Tom' => 36]

Для сортировки в порядке убывания можно использовать krsort:

PHP

krsort($students); // ['Tom' => 36, 'John' => 47, 'Bob' => 24]

Перемешивание элементов случайным образом

Если вам нужно перемешать элементы в массиве случайным образом, то можно воспользоваться функцией shuffle:

PHP
<?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
<?php
$languages = [
  'en' => 'English',
  'fr' => 'French',
  'es' => 'Spanish',
  'pt' => 'Portuguese',
];
$languagesReverse = array_reverse($languages);
echo '<pre>';
print_r($languagesReverse);
echo '</pre>';
Создание нового массива в PHP, в котором элементы выстроены в обратном порядке относительно исходного массива

Работа над массивами как с множествами значений

В PHP имеются функции: array_merge, array_intersect и array_diff. Они позволяют работать с массивами как с множествами значений.

1. Объединение одного или несколько массивов вместе выполняется в PHP с помощью функции array_merge:

PHP
array_merge(array ...$arrays): array

Например, объединим с помощью array_merge элементы 3 массивов вместе:

PHP
<?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>';
Объединение значений из разных массивов в PHP

Если массивы имеют одинаковые строковые ключи, то более позднее значение этого ключа перезапишет предыдущее. Например, значение 'green' ключа 'color' перезапишет 'red'.

Однако если массивы содержат числовые ключи, то более позднее значение не перезаписывает предыдущее, оно будет просто добавлено в массив. Значения с числовыми ключами в результирующем массиве будут перенумерованы последовательно начиная с нуля.

Функция array_merge, вызванная без аргументов возвращает пустой массив:

PHP
<?php
$array = array_merge(); // []

2. Функция array_intersect вычисляет пересечения значений основного массива со значениями других массивов:

PHP
// $base – основной массив
// $arrays – другие массивы
array_intersect(array $base, array ...$arrays): array

В качестве результата оно возвращает массив со значениями основного массива, которые имеются во всех других массивах.

Например:

PHP
<?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
<?php
$base = ['color' => 'red', 1, 'php', 4];
$array1 = [3, 'color' => 'red'];
$array2 = [4, 'php'];

$result = array_diff($base, $array1, $array2); // [0 => 1]

Проверить имеется ли указанное значение в массиве можно с помощью функции in_array:

PHP
if (in_array('apple', $fruits)) {
  // значение 'apple' имеется в массиве $fruits
}

Здесь, в первый аргумент необходимо передать искомое значение, а во второй – сам массив. В качестве результата in_array возвращает true или false.

Кроме in_array в PHP имеется ещё функция array_search. Она выполняет тоже самое, но в отличие от in_array возвращает ключ этого значения.

Если нужно проверить наличие не значения, а ключа, то можно воспользоваться функцией array_key_exists:

PHP
if (array_key_exists('es', $languages)) {
  // ключ 'es' имеется в массиве $languages
}

Сериализация

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

Сериализация массива в строку выполняется с помощью функции serialize. Для декодирования строки, содержащей сериализованный массив, обратно в исходный массив используется функция unserialize:

PHP
// исходный массив
$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>';

Многомерные массивы

Многомерные массивы – это массивы, элементы которого просто содержат другие массивы.

Пример создания двумерного массива:

PHP
$software = [
  'os' => ['Windows', 'Linux', 'macOS'],
  'browsers' => ['Firefox', 'Chrome', 'Safari', 'Edge'],
  'code editors' => ['Visual Studio Code', 'Atom', 'Sublime Text'],
];

По сути двумерный массив – это массив массивов. Обращение к элементу массива в этом случае осуществляется с использованием двух квадратных скобок:

PHP
echo $software['os'][0]; // 'Windows'
$software['browsers'][3] = 'Opera';

Выведем с помощью функции print_r массив $software в форматированном виде:

PHP
echo '<pre>';
print_r($software);
echo '</pre>';
Вывод двумерного PHP-массива в форматированном виде

Комментарии: 0