Массивы в PHP: обычные, ассоциативные и foreach

Массивы в 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

Что открыть дальше

Оцените статью
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x