Урок 4. Массивы и foreach
Массив хранит много значений под одним именем: список товаров, оценки ученика, строки из базы данных. Каждое значение в массиве лежит под своим ключом — номером или именем.
Список
<?php
$fruits = ["яблоко", "груша", "слива"];
echo $fruits[0] . "\n";
echo count($fruits) . "\n";
$fruits[] = "вишня";
echo $fruits[3] . "\n";яблоко
3
вишняНомера элементов начинаются с нуля: первый — $fruits[0], третий — $fruits[2]. count возвращает число элементов, а пустые скобки $fruits[] = … добавляют элемент в конец. В старом коде вместо квадратных скобок встречается array("яблоко", "груша") — это то же самое.
Ассоциативный массив
Вместо номеров ключами могут быть строки. Такой массив похож на карточку с полями:
<?php
$user = [
"name" => "Иван",
"city" => "Гродно",
"age" => 30,
];
echo $user["name"] . " из города " . $user["city"] . "\n";
$user["age"] = 31;
echo "Возраст: {$user['age']}\n";Иван из города Гродно
Возраст: 31Пара пишется как ключ => значение. Запятая после последней пары разрешена и удобна: новую строку можно дописать, не трогая предыдущую. Внутри строки в двойных кавычках элемент массива берут в фигурные скобки: {$user['age']}.
Если ключа в массиве нет, PHP выводит предупреждение Undefined array key. Как его избежать — в справке Undefined variable и Undefined array key.
Цикл foreach
foreach проходит по всем элементам массива по порядку:
<?php
$stock = ["яблоки" => 12, "груши" => 7, "сливы" => 0];
$total = 0;
foreach ($stock as $fruit => $count) {
if ($count === 0) {
echo "$fruit: нет в наличии\n";
} else {
echo "$fruit: $count кг\n";
}
$total += $count;
}
echo "Всего: $total кг\n";яблоки: 12 кг
груши: 7 кг
сливы: нет в наличии
Всего: 19 кгНа каждом шаге в $fruit попадает ключ, в $count — значение. Если ключ не нужен, пишут короче: foreach ($fruits as $fruit).
Посмотреть массив целиком
Для отладки массив выводят функцией print_r (или var_dump — с типами):
<?php
$colors = ["красный", "зелёный"];
print_r($colors);Array
(
[0] => красный
[1] => зелёный
)Полезные функции
<?php
$marks = [7, 9, 4, 10, 8];
echo "Оценок: " . count($marks) . "\n";
echo "Сумма: " . array_sum($marks) . "\n";
echo "Лучшая: " . max($marks) . "\n";
echo "Средняя: " . round(array_sum($marks) / count($marks), 1) . "\n";
sort($marks);
echo implode(", ", $marks) . "\n";
var_dump(in_array(10, $marks));Оценок: 5
Сумма: 38
Лучшая: 10
Средняя: 7.6
4, 7, 8, 9, 10
bool(true)| Функция | Что делает |
|---|---|
count($a) | число элементов |
in_array($x, $a) | есть ли значение в массиве |
array_search($x, $a) | ключ найденного значения или false |
array_keys($a), array_values($a) | только ключи / только значения |
sort($a), rsort($a) | сортировка по возрастанию / убыванию, ключи заново с нуля |
asort($a), ksort($a) | сортировка по значениям / по ключам с сохранением ключей |
array_merge($a, $b) | склеить массивы |
array_slice($a, 0, 3) | первые три элемента |
implode(", ", $a) | склеить элементы в строку |
explode(",", $s) | разбить строку на массив |
Функции сортировки меняют сам массив и ничего полезного не возвращают. Запись $sorted = sort($marks) — частая ошибка: в $sorted окажется true, а не массив.
Строка ↔ массив
<?php
$line = "Минск,Брест,Гомель";
$cities = explode(",", $line);
echo count($cities) . "\n";
echo implode(" | ", $cities) . "\n";3
Минск | Брест | Гомельexplode режет строку по разделителю, implode склеивает обратно. Подробнее и с подводными камнями — в справке Как разбить строку на массив.
Массив массивов
Строки таблицы обычно хранят как список ассоциативных массивов — так их возвращает и база данных (урок 9):
<?php
$users = [
["name" => "Анна", "role" => "администратор"],
["name" => "Олег", "role" => "редактор"],
];
foreach ($users as $user) {
echo $user["name"] . " — " . $user["role"] . "\n";
}
echo $users[1]["name"] . "\n";Анна — администратор
Олег — редактор
Олег$users[1]["name"] — сначала второй элемент списка, затем поле name в нём.
Удаление элемента
unset($fruits[1]) удаляет элемент, но номера остальных не сдвигаются: после удаления останутся ключи 0, 2, 3. Чтобы снова пронумеровать с нуля, используют $fruits = array_values($fruits).
Частые ошибки
Warning: Undefined array key 3у списка из трёх элементов — номера идут с нуля, последний элемент —[2].$sorted = sort($a)— в$sortedокажетсяtrue: сортировка меняет сам$a."Возраст: $user['age']"— ошибка разбора (Parse error). В двойных кавычках элемент с ключом в кавычках берут в фигурные скобки:"{$user['age']}".- После
unsetциклforс номерами от 0 доcount - 1натыкается на пропущенный номер. Обходите массив черезforeachили перенумеруйте егоarray_values.
Коротко
- Список:
["a", "b"], номера с нуля; ассоциативный массив:["ключ" => "значение"]. $a[] = $xдобавляет в конец,countсчитает,unsetудаляет.foreach ($a as $key => $value)обходит массив целиком.print_rиvar_dumpпоказывают массив при отладке.sortи другие сортировки меняют сам массив;implodeиexplodeпереводят массив в строку и обратно.