Tableaux bidimensionnels en PHP 8.2 : guide détaillé
Двумерные массивы в PHP
Что такое двумерный массив и зачем он нужен?
Представь себе обычную таблицу в тетради: есть строки и столбцы. В каждой клеточке таблицы хранится какое-то значение. Например, это может быть схема кинозала: строки — это ряды, а столбцы — места в ряду. Или карта острова с сокровищами, где каждая клетка — это участок земли.
В программировании такие таблицы называются двумерными массивами. Это массив, внутри которого находятся другие массивы (строки). А внутри этих массивов уже хранятся отдельные элементы (столбцы).
Двумерные массивы помогают удобно хранить и обрабатывать данные, которые связаны друг с другом и образуют сетку или таблицу.
Основной синтаксис в PHP 8.2
Создать двумерный массив можно двумя способами:
<?php
// Способ 1: Создаём пустой массив и заполняем его
$cinema = [];
$cinema[0] = [1, 2, 3]; // Первая строка: три места
$cinema[1] = [4, 5, 6]; // Вторая строка: три места
// Способ 2: Создаём сразу с данными
$cinema = [
[1, 2, 3],
[4, 5, 6]
];
// Как обратиться к элементу?
// Сначала номер строки, потом номер столбца
echo $cinema[0][1]; // Выведет 2 (первая строка, второе место)
echo $cinema[1][2]; // Выведет 6 (вторая строка, третье место)
?>
Важно помнить: нумерация строк и столбцов начинается с 0!
Как заполнить двумерный массив с клавиатуры?
Часто данные нужно вводить с клавиатуры. Для этого используем вложенные циклы:
<?php
// Вводим размеры таблицы
fscanf(STDIN, "%d %d", $rows, $cols);
// Создаём пустой массив
$matrix = [];
// Заполняем построчно
for ($i = 0; $i < $rows; $i++) {
// Вводим строку чисел
$line = trim(fgets(STDIN));
// Разбиваем строку на отдельные числа
$numbers = explode(" ", $line);
// Сохраняем строку в массив
$matrix[$i] = [];
for ($j = 0; $j < $cols; $j++) {
$matrix[$i][$j] = (int)$numbers[$j];
}
}
// Выводим таблицу на экран
for ($i = 0; $i < $rows; $i++) {
for ($j = 0; $j < $cols; $j++) {
echo $matrix[$i][$j] . " ";
}
echo "\n";
}
?>
Пример работы программы:
Ввод:
2 3
1 2 3
4 5 6
Вывод:
1 2 3
4 5 6
Разбор типичных задач
Задача 1. Кинозал "Уют"
Нужно создать схему зала. Если место свободно — ставим 0, если занято — 1.
<?php
// Вводим размеры зала: ряды и места
fscanf(STDIN, "%d %d", $rows, $seats);
$hall = [];
// Заполняем зал нулями (все места свободны)
for ($i = 0; $i < $rows; $i++) {
$hall[$i] = [];
for ($j = 0; $j < $seats; $j++) {
$hall[$i][$j] = 0;
}
}
// Делаем несколько мест занятыми (для примера)
$hall[0][2] = 1; // Первый ряд, третье место занято
$hall[1][0] = 1; // Второй ряд, первое место занято
// Выводим схему
echo "Схема зала:\n";
for ($i = 0; $i < $rows; $i++) {
for ($j = 0; $j < $seats; $j++) {
echo $hall[$i][$j] . " ";
}
echo "\n";
}
?>
Задача 2. Замена товара на складе
Нужно заменить все товары на определённой полке на новое количество.
<?php
// Исходная матрица склада: 3 полки, на каждой по 4 товара
$warehouse = [
[10, 20, 30, 40],
[50, 60, 70, 80],
[90, 100, 110, 120]
];
echo "Склад до замены:\n";
for ($i = 0; $i < 3; $i++) {
for ($j = 0; $j < 4; $j++) {
echo $warehouse[$i][$j] . " ";
}
echo "\n";
}
// Заменяем все товары на второй полке (индекс 1) на число 999
$rowToChange = 1; // Вторая полка
$newValue = 999;
for ($j = 0; $j < 4; $j++) {
$warehouse[$rowToChange][$j] = $newValue;
}
echo "\nСклад после замены:\n";
for ($i = 0; $i < 3; $i++) {
for ($j = 0; $j < 4; $j++) {
echo $warehouse[$i][$j] . " ";
}
echo "\n";
}
?>
Вывод программы:
Склад до замены:
10 20 30 40
50 60 70 80
90 100 110 120
Склад после замены:
10 20 30 40
999 999 999 999
90 100 110 120
Частые ошибки новичков
- Ошибка 1: Забыть про нумерацию с нуля
Если в массиве 3 строки, то индексы строк: 0, 1, 2. Обращение к строке с индексом 3 вызовет ошибку. - Ошибка 2: Путать строки и столбцы
Первый индекс — это строка, второй — столбец.$matrix[строка][столбец] - Ошибка 3: Не создавать внутренние массивы
Если написать$matrix[$i][$j] = 5, но предварительно не создать$matrix[$i] = [], PHP выдаст ошибку. - Ошибка 4: Не преобразовывать строку в число
При вводе с клавиатуры мы получаем строки. Если не сделать(int), то можно получить неожиданные результаты при вычислениях.
Итоговый пример: Популярность постов
Давай решим задачу про лайки у блогеров. У нас есть 3 блогера, у каждого по 4 поста. Нужно найти общее количество лайков у каждого блогера.
<?php
// Данные: строки — блогеры, столбцы — посты
$likes = [
[150, 200, 80, 300], // Первый блогер
[90, 450, 120, 60], // Второй блогер
[500, 30, 200, 100] // Третий блогер
];
$bloggers = 3;
$posts = 4;
echo "Таблица лайков:\n";
for ($i = 0; $i < $bloggers; $i++) {
echo "Блогер " . ($i + 1) . ": ";
for ($j = 0; $j < $posts; $j++) {
echo $likes[$i][$j] . " ";
}
echo "\n";
}
// Считаем сумму лайков для каждого блогера
echo "\nОбщие лайки:\n";
for ($i = 0; $i < $bloggers; $i++) {
$total = 0;
for ($j = 0; $j < $posts; $j++) {
$total += $likes[$i][$j];
}
echo "Блогер " . ($i + 1) . ": " . $total . " лайков\n";
}
// Находим самого популярного блогера
$maxLikes = 0;
$bestBlogger = 0;
for ($i = 0; $i < $bloggers; $i++) {
$total = 0;
for ($j = 0; $j < $posts; $j++) {
$total += $likes[$i][$j];
}
if ($total > $maxLikes) {
$maxLikes = $total;
$bestBlogger = $i + 1;
}
}
echo "\nСамый популярный блогер: №" . $bestBlogger . " с " . $maxLikes . " лайками\n";
?>
Вывод программы:
Таблица лайков:
Блогер 1: 150 200 80 300
Блогер 2: 90 450 120 60
Блогер 3: 500 30 200 100
Общие лайки:
Блогер 1: 730 лайков
Блогер 2: 720 лайков
Блогер 3: 830 лайков
Самый популярный блогер: №3 с 830 лайками
Двумерные массивы — это мощный инструмент для работы с табличными данными. Главное — не путать строки и столбцы, помнить про нумерацию с нуля и всегда создавать внутренние массивы перед их заполнением. Практикуйся, и ты быстро освоишь эту тему!