- Создавать индексированные, ассоциативные и многомерные массивы и обращаться к их элементам
- Обходить массивы с помощью
foreachи использовать функцииcount,implode,array_column - Сортировать массивы, раскладывать их (деструктуризация) и объединять с помощью
...
В классе 25 учеников, и нужно хранить оценки каждого. Создать 25 отдельных переменных? Конечно, нет. Здесь помогает массив — структура, которая хранит много значений под одним именем. В PHP массив служит и списком, и словарём, поэтому он встречается почти в каждом скрипте.
Индексированные массивы
Массив создаётся квадратными скобками: ["Baku", "Ganja"]. Элементы нумеруются индексами, начиная с 0. Запись $cities[] = ... добавляет новый элемент в конец, count возвращает количество элементов, а print_r показывает всё содержимое массива.
<?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, Shakiimplode склеивает элементы массива в одну строку через указанный разделитель, а 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
$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
$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
$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
[$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);$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.
$a = [10, 20, 30]; echo $a[1];?