Массивы — способ хранить много похожей информации в одном месте.

Массив проще всего представить как много подписанных коробок при переезде. В каждой коробке может лежать что угодно, например, числа, строки, объекты или даже другие коробки.

Обычный и горный массив

Зачем нужны массивы

В массивах хранится информация — например, о том, что лежит в каждой коробке. В коробки можно заглянуть, используя индекс элемента — номер коробки.

Каждая коробка — элемент массива, номер под ней — индекс. То, что лежит внутри коробки — значение элемента.

Как создать массив в PHP

Чтобы создать массив в PHP напишем так:

$my_array = array();

Теперь есть два способа туда что-то добавить. Если мы знаем, на какое место в массиве вставить элемент, используем индекс.

$my_array[1] = "Кухня"
$my_array[2] = "Спальня"

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

$my_array[] = "Кухня"
$my_array[] = "Спальня"

Нумерация в массивах

По умолчанию счёт элементов массива идёт от нуля. То есть при обращении к коробкам нужно помнить, что у первой номер ноль, у второй — 1, и так далее.

Обыкновенный массив
Здесь у второго элемента массива номер 1, а значение — 2

Но массиву можно задать любую нумерацию. Допустим, мы хотим записать в массив значения степеней двойки.

$a[2] = 4;
$a[4] = 16;
$a[7] = 128;
var_dump($a);

Этот код создаст массив из трёх элементов, с номерами 2, 4 и 7. Это легко проверить, если запустить его:

array(3) {
  [2]=>
  int(4)
  [4]=>
  int(16)
  [7]=>
  int(128)
}

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

Это такие же массивы, только у них индекс не число, а строка. Или что угодно ещё. Неудобно подписывать коробки при переезде по номерам — но если написать «Кухня», «Спальня» или «Гостиная», то сразу будет понятно, где что.

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

Кухонные коробки

Возьмём кухонную коробку, в которой лежат ложки, ножи и тарелки. Можно собрать её двумя способами. Так:

$kitchen = array("Spoons"=>"35", "Knifes"=>"3", "Plates"=>"12");

Или так:

$kitchen['Spoons'] = "35";
$kitchen['Knifes'] = "3";
$kitchen['Plates'] = "12";

Тогда если нам нужно будет понять, сколько тарелок лежит в коробке, воспользуемся кодом $kitchen['Plates'];.

Как вывести массив

Чтобы вывести всё содержимое ассоциативного массива (в нашем случае, кухонной коробки), воспользуемся циклом foreach, который перебирает все элементы внутри массива.

foreach($kitchen as $item => $item_count) {
  echo "Item=" . $item . ", Value=" . $item_count;
}

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

Получаем данные из форм через $_GET и $_POST

Представьте форму обратной связи на сайте — там есть поле для имени, электропочты и для злого письма о том, что ничего не работает. Когда мы передаём информацию из формы в PHP, она попадает в массивы $_GET или $_POST.

$_GET и $_POST — тоже ассоциативные массивы. Ключами в них будут имена переданных данных. Смотрите, как просто.

Получение данных через $_POST

Это форма обратной связи с тремя полями. Обратите внимание на атрибуты name в каждом из полей ввода.

<form action="foo.php" method="post">
  <label for="username">Имя:</label>    
  <input type="text" name="username" id="username">
 
  <label for="email">Email:</label>   
  <input type="text" name="email" id="email">
 
  <label for="feedback">Отзыв</label>
  <input type="textarea" name="feedback" id="feedback"></textarea>
 
  <input type="submit" name="submit" value="Отправь меня!">
</form>

А это код страницы foo.php на PHP, который выведет данные формы, полученные через POST. Здесь мы используем те самые значения атрибутов name, чтобы получить данные из соответствующих полей.

<?php
echo $_POST['username']; // имя пользователя
echo $_POST['email']; // почта
echo $_POST['feedback']; // текст отзыва
?>

То есть username, email и feedback — ключи, которые не отличаются от атрибута name в форме.

Получение данных через $_GET

Это такая же форма, как выше. Разница в method="get" — и чуть позже расскажу, в чём ещё.

<form action="foo.php" method="get">
  <label for="username">Имя:</label>    
  <input type="text" name="username" id="username">
 
  <label for="email">Email:</label>   
  <input type="text" name="email" id="email">
 
  <label for="feedback">Отзыв</label>
  <input type="textarea" name="feedback" id="feedback"></textarea>
 
  <input type="submit" name="submit" value="Отправь меня!">
</form>

Код для получения значений формы через $_GET очень похож на прошлый — нужно заменить POST на GET.

<?php
echo $_GET['username'];
echo $_GET['email'];
echo $_GET['feedback'];
?>

Значительная разница в том, что при загрузке страницы с таким кодом, в адресе страницы появятся данные из формы.

Адресная строка

С получением данных через GET и POST можно поэкспериментировать в первой главе курса «Знакомство с PHP».

Получение массива из базы MySQL

Ещё один частый случай использования ассоциативных массивов — при загрузке данных из базы данных. И если мы храним большую таблицу в базе, то может быть неудобно назначать столбцам номера. А вот чтобы у каждого элемента ключом стал заголовок — хорошая практика, так и запоминать будет удобнее.

Допустим, у нас есть база данных в MySQL, мы подключаемся к ней, делаем запрос и получаем список пользователей.

$dbc = mysqli_connect('localhost', 'root', 'password', 'my_users');
$query = "SELECT first_name FROM members";
$result = mysqli_query($dbc, $query);
$data_array = array();
while ($row = mysqli_fetch_assoc($result)) {
  $data_array[$row['name']] = $row['value'];
}

Разбираем код

$dbc = mysqli_connect('localhost', 'root', 'password', 'my_users');

Подключаемся к базе MySQL my_users по адресу localhost, от имени пользователя root, с паролем password.

$query = "SELECT phone FROM members";

Запрос — получить номера телефонов всех пользователей из таблицы members.

$result = mysqli_query($dbc, $query);

Делаем запрос к базе с помощью существующей в PHP функции mysqli_query.

$data_array = array();

Заводим пустой массив для полученных данных.

while ($row = mysqli_fetch_assoc($result)) {

В этой строчке начинаем построчно считывать результаты.

$data_array[$row['name']] = $row['value'];

И если результаты есть, записываем их в ассоциативный массив.

Упражнения с массивами на PHP

У нас есть бесплатный интерактивный курс, где можно без установки PHP, прямо в браузере написать код для реального сайта. И заодно разобраться с массивами, циклами и тем, как работает вся эта магия.

Интерфейс интерактивного курса