🐘 PHP

PHP 8.2 में द्वि-आयामी ऐरे: विस्तृत मार्गदर्शिका

Двумерные массивы в 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 лайками

Двумерные массивы — это мощный инструмент для работы с табличными данными. Главное — не путать строки и столбцы, помнить про нумерацию с нуля и всегда создавать внутренние массивы перед их заполнением. Практикуйся, и ты быстро освоишь эту тему!