Цикл FOREACH в PHP

С помощью цикла FOREACH мы можем перебрать все элементы массива и выполнить для них (или только для некоторых из них) какие-либо действия.

Допустим, у нас есть массив товаров. Нужно вывести имена всех товаров, разделив их тегом <br>:

<?php
    $products[] = ['name' => 'Товар1', 'price' => 1000];
    $products[] = ['name' => 'Товар2', 'price' => 2000];
    $products[] = ['name' => 'Товар3', 'price' => 3000];
    $products[] = ['name' => 'Товар4', 'price' => 4000];
    
    foreach($products as $product)
        echo $product['name'] . '<br>';
?>

Результат в браузере:

Товар1
Товар2
Товар3
Товар4

Круто, да? Всего 2 строчки кода для вывода, причём неважно, насколько большой исходный массив! А теперь попробуем разобраться, как это работает.

Принцип работы цикла FOREACH

Возьмём пример попроще:

<?php
    $arr = [5, 10, 15];
    
    foreach($arr as $value)
        echo $value;
?>

Когда мы запускаем цикл, PHP берёт первое значение массива и помещает его в переменную $value. Затем один раз выполняется блок кода. Затем PHP делает тоже самое со вторым значением, третьим и т.д.

Получается, команды, принадлежащие циклу FOREACH, будут запущены столько раз, сколько в нашем массиве элементов.

Для получения доступа к ключам массива существует следующий синтаксис:

<?php
    $arr = [10, 15, 20];
    
    foreach($arr as $key => $value)
        echo $key, ' ', $value, '<br>';
?>

Результат в браузере:

0 10
1 15
2 20

Чтобы выполнить в цикле несколько команд, используем уже знакомые нам фигурные скобки {}:

<?php
    foreach($arr as $v)
    {
        echo $v;
        echo '<br>';
    }
?>

Перебор многомерного массива

Создадим обычный двумерный массив:

<?php
$arr['title1'] = [5, 10, 15];
$arr['title2'] = [48, 12, 0];
$arr['title3'] = [17, 24, 1280];

Если нужно перебрать элементы только одного индекса, мы можем сделать так:

foreach($arr['title3'] as $value)
    echo $value, '<br>';

Если нам требуется вывести все ключи, мы можем использовать два цикла foreach, один внутри другого:

<?php
$arr['title1'] = [5, 10, 15];
$arr['title2'] = [48, 12, 0];
$arr['title3'] = [17, 24, 1280];

foreach($arr as $title => $values)
{
	echo 'Title: ', $title, '<br>';

	foreach($values as $value)
		echo 'Value: ', $value, '<br>';

	echo '<br>';
}

Результат в браузере:

Title: title1
Value: 5
Value: 10
Value: 15

Title: title2
Value: 48
Value: 12
Value: 0

Title: title3
Value: 17
Value: 24
Value: 1280
Задача №1

1. Создайте массив $arr и заполните его тремя значениями.
2. С помощью цикла foreach выведите все ключи и значения этого массива. Между ключом и значением должна быть строка -> , а после значения - перенос строки (тег <br>).

<?php
$arr = ['Перебор', 'одномерного', 'массива'];

foreach($arr as $k => $v)
	echo $k, ' -> ', $v, '<br>';
Задача 2

1. Создайте массив $arr и заполните его тремя значениями, каждое из которых должно быть одномерным массивом. В итоге должен получиться обычный двумерный массив.
2. Выведите ключи массива.
3. Выведите все значения подмассивов. Значения каждого подмассива разделите запятыми, но так, чтобы запятая была только между элементами, её не должно быть перед первым элементом и после последнего.
Например, для массива [1,2,3] нужно вывести строку 1, 2, 3

<?php
$arr[] = [1, 2, 3];
$arr[] = [4, 5, 6];
$arr[] = [7, 8, 9];

foreach($arr as $k => $values)
	echo 'Title: ', $k, ' Values: ' . implode(', ', $values), '<br>';

Забыли, что делает функция implode? Тогда рекомендую пересмотреть урок Преобразование массивов.