Итерация с вложенными циклами
Часть раздела Логика и управление потоком путешествия по PHP на Coddy. Урок 30 из 68.
При работе с двумерными массивами часто нужно обработать каждый элемент, то есть пройти по каждой строке, а затем по каждому столбцу этой строки. Здесь не обойтись без вложенных циклов: вы помещаете один цикл внутрь другого, чтобы последовательно обойти всю сетку.
Внешний цикл перебирает строки двумерного массива, а внутренний обрабатывает каждый элемент текущей строки. Вот как это работает с циклом foreach:
<?php
$schedule = [
["Meeting", "Lunch", "Presentation"],
["Training", "Review", "Planning"],
["Workshop", "Break", "Demo"]
];
foreach ($schedule as $day) {
foreach ($day as $appointment) {
echo $appointment . "\n";
}
}
?>Можно также использовать обычные циклы for, если нужен больший контроль над индексами. Такой подход даёт доступ и к индексу строки, и к индексу столбца:
<?php
for ($row = 0; $row < count($schedule); $row++) {
for ($col = 0; $col < count($schedule[$row]); $col++) {
echo "Day " . ($row + 1) . ", Time " . ($col + 1) . ": " . $schedule[$row][$col] . "\n";
}
}
?>Этот шаблон вложенных циклов — основа полной обработки двумерных массивов: выводите ли вы данные, выполняете вычисления или ищете определённые значения во всей сетке.
Задание
ЛегкоНа вход подаётся одно значение: двумерный массив в формате JSON, описывающий рассадку в классе. Каждый вложенный массив — это ряд мест, а каждый элемент содержит либо имя ученика, либо пустую строку, если место свободно. Прочитайте входные данные, преобразуйте строку JSON в двумерный массив, с помощью вложенных циклов переберите всю схему рассадки и выведите имя каждого ученика вместе с его местом в формате: Row X, Seat Y: Name
Пропускайте свободные места (пустые строки) и выводите информацию только о занятых местах. Ряды и места нумеруются начиная с 1 (а не с 0).
Формат входных данных: одна строка с массивом JSON, описывающим схему рассадки (пример: [["Alice","Bob",""],["","Charlie","Diana"],["Eve","","Frank"]])
Ожидаемый вывод: каждое занятое место на отдельной строке в формате Row X, Seat Y: Name, где X — номер ряда, а Y — номер места (оба нумеруются начиная с 1)
Попробуйте сами
<?php
// Прочитать входные данные JSON
$input = trim(fgets(STDIN));
// Преобразовать строку JSON в двумерный массив
$seating = (array)json_decode($input, true);
// TODO: Напишите ваш код ниже
// Используйте вложенные циклы для перебора рядов и мест
// Не забудьте пропускать пустые места и нумеровать ряды/места начиная с 1
?>В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Продвинутые функции
Анонимные функцииЗамыкания и 'use'Стрелочные функцииCallback-функцииИспользование 'call_user_func'Функции переменныхПередача по ссылкеРекурсивные функцииИтоги: ассорти из функций4Многомерные массивы
Создание 2D-массиваДоступ к элементам 2D-массиваИзменение элементов 2D-массиваИтерация с вложенными цикламиДвумерные ассоциативные массивыИтоги: Упражнение «Простая сетка»2Продвинутая работа с массивами
Добавление с помощью 'array_push'Удаление с помощью 'array_pop'Добавление с помощью 'array_unshift'Удаление с помощью 'array_shift'Слияние индексных массивовСлияние ассоциативных массивовИзвлечение с помощью 'array_slice'Поиск значений с 'in_array'Поиск ключей с 'array_search'Итоги: Упражнение «Плейлист»3Сортировка массивов
Сортировка индексных массивов по возрастаниюСортировка индексных массивов по убываниюСортировка ассоциативных массивов по значениюСортировка ассоциативных массивов по ключуСортировка в естественном порядкеПользовательская сортировка с помощью 'usort'Итоги: Сортировка таблицы лидеровПотренируйтесь самостоятельно: Онлайн-компилятор PHP