Перейти к содержанию
Educora
Начальный16 мин4 / 10

Массивы и foreach

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

Проверь себя
В этом уроке ты узнаешь
  • Создавать индексированные, ассоциативные и многомерные массивы и обращаться к их элементам
  • Обходить массивы с помощью foreach и использовать функции count, implode, array_column
  • Сортировать массивы, раскладывать их (деструктуризация) и объединять с помощью ...

В классе 25 учеников, и нужно хранить оценки каждого. Создать 25 отдельных переменных? Конечно, нет. Здесь помогает массив — структура, которая хранит много значений под одним именем. В PHP массив служит и списком, и словарём, поэтому он встречается почти в каждом скрипте.

Индексированные массивы

Массив создаётся квадратными скобками: ["Baku", "Ganja"]. Элементы нумеруются индексами, начиная с 0. Запись $cities[] = ... добавляет новый элемент в конец, count возвращает количество элементов, а print_r показывает всё содержимое массива.

PHP
<?php

$cities = ["Baku", "Ganja", "Sumgait"];
$cities[] = "Shaki";

echo $cities[0], "\n";
echo count($cities), "\n";
echo $cities[count($cities) - 1], "\n";
print_r($cities);
echo implode(", ", $cities), "\n";
Ожидаемый результат
Baku
4
Shaki
Array
(
    [0] => Baku
    [1] => Ganja
    [2] => Sumgait
    [3] => Shaki
)
Baku, Ganja, Sumgait, Shaki

implode склеивает элементы массива в одну строку через указанный разделитель, а explode делает обратное: разбивает строку на массив по разделителю. Если обратиться к несуществующему индексу, PHP 8 выдаст предупреждение Undefined array key и вернёт null.

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

В ассоциативном массиве вместо номеров используются осмысленные ключи: "name" => "Leyla". Это удобно, чтобы хранить сведения об одном объекте. Цикл **foreach** проходит по каждому элементу массива: foreach ($arr as $value) даёт только значения, а foreach ($arr as $key => $value) — ещё и ключи. Существует ли ключ, проверяют с помощью isset или array_key_exists.

PHP
<?php

$student = [
    "name" => "Leyla",
    "age" => 14,
    "city" => "Baku",
];
$student["grade"] = 8;

echo "{$student['name']} is {$student['age']} years old\n";
var_dump(isset($student["email"]));
var_dump(array_key_exists("city", $student));

foreach ($student as $key => $value) {
    echo "$key: $value\n";
}
Ожидаемый результат
Leyla is 14 years old
bool(false)
bool(true)
name: Leyla
age: 14
city: Baku
grade: 8

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

Элементом массива может быть другой массив. Именно так обычно выглядят результаты из базы данных: список строк, где каждая строка — ассоциативный массив. array_column достаёт один столбец из всех строк.

PHP
<?php

$students = [
    ["name" => "Aysel", "marks" => [5, 4, 5]],
    ["name" => "Murad", "marks" => [4, 4, 3]],
    ["name" => "Elvin", "marks" => [5, 5, 5]],
];

foreach ($students as $student) {
    $avg = array_sum($student["marks"]) / count($student["marks"]);
    echo $student["name"] . ": " . round($avg, 1) . "\n";
}

echo $students[1]["marks"][2], "\n";
echo implode(", ", array_column($students, "name")), "\n";
Ожидаемый результат
Aysel: 4.7
Murad: 3.7
Elvin: 5
3
Aysel, Murad, Elvin

Сортировка и полезные функции

PHP
<?php

$prices = ["bread" => 0.8, "milk" => 1.9, "cheese" => 7.5, "tea" => 4.2];

echo count($prices), "\n";
echo array_sum($prices), "\n";
echo max($prices), "\n";
var_dump(in_array(1.9, $prices));
echo implode(", ", array_keys($prices)), "\n";

asort($prices);
echo implode(", ", array_keys($prices)), "\n";
arsort($prices);
echo array_key_first($prices), "\n";

$colors = explode(",", "red,green,blue");
sort($colors);
print_r($colors);
Ожидаемый результат
4
14.4
7.5
bool(true)
bread, milk, cheese, tea
bread, milk, tea, cheese
cheese
Array
(
    [0] => blue
    [1] => green
    [2] => red
)
ФункцияСортирует поКлючи
sort / rsortзначению, по возрастанию / убываниюперенумеровываются
asort / arsortзначению, по возрастанию / убываниюсохраняются
ksort / krsortключу, по возрастанию / убываниюсохраняются
usortтвоей функции сравнения (следующий урок)перенумеровываются
Все функции сортировки изменяют сам массив и не возвращают новый.

Деструктуризация и распаковка

Элементы массива можно одной строкой записать в отдельные переменные: [$a, $b] = $pair; — это называется деструктуризацией. Для ассоциативного массива указывают ключи. А оператор распаковки ... «высыпает» элементы одного массива внутрь другого.

PHP
<?php

[$first, $second] = ["gold", "silver"];
echo "$first, $second\n";

$a = 1;
$b = 2;
[$a, $b] = [$b, $a];
echo "a=$a b=$b\n";

["name" => $name, "city" => $city] = ["name" => "Nigar", "city" => "Shaki"];
echo "$name lives in $city\n";

$morning = ["tea", "bread"];
$evening = ["soup", "salad"];
$menu = [...$morning, ...$evening, "cake"];
echo implode(" + ", $menu), "\n";
Ожидаемый результат
gold, silver
a=2 b=1
Nigar lives in Shaki
tea + bread + soup + salad + cake
Старый стиль
$user = array('name' => 'Aysel', 'age' => 15);
list($x, $y) = $point;
$all = array_merge($boys, $girls);
Современный PHP
$user = ['name' => 'Aysel', 'age' => 15];
[$x, $y] = $point;
$all = [...$boys, ...$girls];
array() и list() по-прежнему работают, но в новом коде стандартом стала короткая запись [].

Главное

  • Элементы индексированного массива нумеруются с 0; $arr[] = $x добавляет элемент в конец, а count возвращает размер.
  • Ассоциативный массив хранит пары ключ => значение; foreach ($arr as $key => $value) даёт и то и другое.
  • Многомерные массивы похожи на таблицы; array_column извлекает один столбец.
  • sort теряет ключи, asort и ksort их сохраняют; функции сортировки меняют сам массив.
  • [$a, $b] = $arr раскладывает массив, а [...$a, ...$b] объединяет массивы.

Проверь себя

Вопросов: 10. Каждый правильный ответ приносит XP.

1 / 10
Что выведет $a = [10, 20, 30]; echo $a[1];?