Массивы в PHP встречаются везде: список товаров, настройки страницы, данные формы, строки из базы, меню, ошибки валидации. В этом уроке разберем обычные массивы, ассоциативные массивы и foreach на понятном примере: выведем таблицу товаров на страницу
Важно: в PHP слово array может означать и список, и словарь. Поэтому лучше сразу увидеть оба варианта
Что получится в конце
Страница покажет таблицу:
Название Цена
Книга по PHP 1200
Курс по MySQL 2500
Данные будут храниться в массиве:
$products = [
['title' => 'Книга по PHP', 'price' => 1200],
['title' => 'Курс по MySQL', 'price' => 2500],
];
Создаем проект
mkdir php-arrays
cd php-arrays
Файл index.php:
<?php
$products = [
['title' => 'Книга по PHP', 'price' => 1200],
['title' => 'Курс по MySQL', 'price' => 2500],
['title' => 'Практика с формами', 'price' => 900],
];
?>
<!doctype html>
<html lang="ru">
<head>
<meta charset="utf-8">
<title>Массивы PHP</title>
</head>
<body>
<h1>Товары: <?= count($products) ?></h1>
<table border="1" cellpadding="8">
<tr>
<th>Название</th>
<th>Цена</th>
</tr>
<?php foreach ($products as $product): ?>
<tr>
<td><?= htmlspecialchars($product['title']) ?></td>
<td><?= htmlspecialchars((string) $product['price']) ?></td>
</tr>
<?php endforeach; ?>
</table>
</body>
</html>
Запустите:
php -S localhost:8000
Откройте http://localhost:8000
Обычный массив
Простой список:
$names = ['Алия', 'Тимур', 'Мария'];
Элементы получают числовые индексы:
echo $names[0]; // Алия
Индексация начинается с нуля. Если обратиться к несуществующему индексу, PHP покажет предупреждение
Ассоциативный массив
Ассоциативный массив хранит значения по ключам:
$product = [
'title' => 'Книга по PHP',
'price' => 1200,
];
Получение значения:
echo $product['title'];
Такой формат удобен для объектов данных: товар, пользователь, заявка, настройка. В базовом PHP-коде ассоциативные массивы встречаются постоянно
Массив массивов
Список товаров — это массив, где каждый элемент тоже массив:
$products = [
['title' => 'Книга по PHP', 'price' => 1200],
['title' => 'Курс по MySQL', 'price' => 2500],
];
Первый товар:
$products[0]['title'];
Но вручную обращаться по индексам неудобно. Для вывода списка используем foreach
foreach
Цикл:
foreach ($products as $product) {
echo $product['title'];
}
проходит по каждому элементу массива. В HTML-шаблоне удобно использовать альтернативный синтаксис:
<?php foreach ($products as $product): ?>
<p><?= htmlspecialchars($product['title']) ?></p>
<?php endforeach; ?>
Он лучше читается, когда PHP перемешан с HTML
count
Функция:
count($products)
возвращает количество элементов. В нашем примере это число товаров
Не используйте count внутри условия цикла, если массив большой и логика сложная. Для простых страниц это не проблема, но хорошая привычка — считать один раз, если значение нужно несколько раз
Добавляем итоговую сумму
Перед HTML:
$total = 0;
foreach ($products as $product) {
$total += $product['price'];
}
В HTML:
<p>Сумма: <?= htmlspecialchars((string) $total) ?></p>
Так вы видите, что foreach годится не только для вывода, но и для расчета
Частые ошибки
Undefined array key. Ключа нет в массиве. Проверьте написание: title и titel для PHP разные ключи
Trying to access array offset on value of type null. Вы ожидаете массив, но получили null. Проверьте источник данных
HTML ломается от данных. Выводите строки через htmlspecialchars
Запутались в индексах. Если данные имеют имена полей, используйте ассоциативные ключи, а не голые индексы
Что может быть еще интересно по этой теме
Массив PHP это список или словарь? И то и другое. PHP array умеет хранить значения по числовым и строковым ключам
Когда переходить от массива к классу? Когда у данных появляется поведение, правила и повторяемая структура. Для простого шаблона массив нормален
Почему строки цены приводятся к string перед htmlspecialchars? htmlspecialchars ожидает строку. Явное приведение делает намерение понятным
Как массивы связаны с базой данных? PDO часто возвращает строки из базы как ассоциативные массивы. Поэтому эта тема нужна до MySQL
Что открыть дальше
- Формы в PHP: GET, POST и первая обработка — формы часто приходят как массивы.
- PHP и MySQL через PDO: первая база без SQL-инъекций — строки из базы удобно выводить через
foreach. - Composer в PHP: установка пакетов без ручного копирования — следующий шаг к современному PHP-проекту.
- PHP для WordPress: первый маленький shortcode — WordPress-код постоянно работает с массивами настроек.



