foreach
Конструкция foreach предоставляет простой способ перебора массивов. Foreach работает только с массивами и объектами, и будет генерировать ошибку при попытке использования с переменными других типов или неинициализированными переменными. Существует два вида синтаксиса:
foreach (array_expression as $value) statement foreach (array_expression as $key => $value) statement
Первый цикл перебирает массив, задаваемый с помощью array_expression. На каждой итерации значение текущего элемента присваивается переменной $value и внутренний указатель массива увеличивается на единицу (таким образом, на следующей итерации цикла работа будет происходить со следующим элементом).
Второй цикл будет дополнительно соотносить ключ текущего элемента с переменной $key на каждой итерации.
Замечание:
Когда оператор foreach начинает исполнение, внутренний указатель массива автоматически устанавливается на первый его элемент Это означает, что нет необходимости вызывать функцию reset() перед использованием цикла foreach.
Так как оператор foreach опирается на внутренний указатель массива, его изменение внутри цикла может привести к непредсказуемому поведению.
Для того, чтобы напрямую изменять элементы массива внутри цикла, переменной $value должен предшествовать знак &. В этом случае значение будет присвоено по ссылке.
$arr = array( 1 , 2 , 3 , 4 );
foreach ( $arr as & $value ) $value = $value * 2 ;
>
// массив $arr сейчас таков: array(2, 4, 6, 8)
unset( $value ); // разорвать ссылку на последний элемент
?>?php
Указатель на $value возможен, только если на перебираемый массив можно ссылаться (т.е. если он является переменной). Следующий код не будет работать:
Ссылка $value на последний элемент массива остается даже после того, как оператор foreach завершил работу. Рекомендуется уничтожить ее с помощью функции unset() .
Замечание:
Оператор foreach не поддерживает возможность подавления сообщений об ошибках с помощью префикса ‘@’.
Вы могли заметить, что следующие конструкции функционально идентичны:
$arr = array( «one» , «two» , «three» );
reset ( $arr );
while (list(, $value ) = each ( $arr )) echo «Значение: $value
\n» ;
>
?php
foreach ( $arr as $value ) echo «Значение: $value
\n» ;
>
?>
Следующие конструкции также функционально идентичны:
$arr = array( «one» , «two» , «three» );
reset ( $arr );
while (list( $key , $value ) = each ( $arr )) echo «Ключ: $key ; Значение: $value
\n» ;
>
?php
foreach ( $arr as $key => $value ) echo «Ключ: $key ; Значение: $value
\n» ;
>
?>
Вот еще несколько примеров, демонстрирующие использование оператора:
foreach ( $a as $v ) echo «Текущее значение переменной \$a: $v .\n» ;
>
/* Пример 2: значение (для иллюстрации массив выводится в виде значения с ключом) */
$i = 0 ; /* только для пояснения */
foreach ( $a as $v ) echo «\$a[ $i ] => $v .\n» ;
$i ++;
>
$a = array(
«one» => 1 ,
«two» => 2 ,
«three» => 3 ,
«seventeen» => 17
);
foreach ( $a as $k => $v ) echo «\$a[ $k ] => $v .\n» ;
>
/* Пример 4: многомерные массивы */
$a = array();
$a [ 0 ][ 0 ] = «a» ;
$a [ 0 ][ 1 ] = «b» ;
$a [ 1 ][ 0 ] = «y» ;
$a [ 1 ][ 1 ] = «z» ;
foreach ( $a as $v1 ) foreach ( $v1 as $v2 ) echo » $v2 \n» ;
>
>
/* Пример 5: динамические массивы */
foreach (array( 1 , 2 , 3 , 4 , 5 ) as $v ) echo » $v \n» ;
>
?>
Распаковка вложенных массивов с помощью list()
В PHP 5.5 была добавлена возможность обхода массива массивов с распаковкой вложенного массива в переменные цикла, передав list() в качестве значения.
foreach ( $array as list( $a , $b )) // $a содержит первый элемент вложенного массива,
// а $b содержит второй элемент.
echo «A: $a ; B: $b \n» ;
>
?>
Результат выполнения данного примера:
Можно передавать меньшее количество элементов в list() , чем находится во вложенном массиве, в этом случае оставшиеся значения массива будут проигнорированы:
foreach ( $array as list( $a )) // Обратите внимание на отсутствие $b.
echo » $a \n» ;
>
?>
Результат выполнения данного примера:
Если массив содержит недостаточно элементов для заполнения всех переменных из list() , то будет сгенерировано замечание об ошибке:
foreach ( $array as list( $a , $b , $c )) echo «A: $a ; B: $b ; C: $c \n» ;
>
?>
Результат выполнения данного примера:
Notice: Undefined offset: 2 in example.php on line 7 A: 1; B: 2; C: Notice: Undefined offset: 2 in example.php on line 7 A: 3; B: 4; C:
Вывести многомерный массив php foreach
В предыдущих примерах рассматривались только одномерные массивы, где значения элементов представляли числа, строки. Но в PHP массивы могут также быть многомерными, то есть такими, где элемент массива сам является массивом.
Например, создадим многомерный массив с помощью функции array() :
$families = array(array("Tom", "Alice"), array("Bob", "Kate"));
$families = [["Tom", "Alice"], ["Bob", "Kate"]];
Выше определенный многомерный массив $families является двухмерным (частный случай многомерного массива), который можно представить в виде таблицы:
Для элементов данного массива не установлены явным образом ключи, поэтому каждый ключ элемента представляет числовой индекс, которые по умолчанию начинаются с нуля. Поэтому чтобы обратиться к первому элементу массива, надо использовать индекс 0 — $families[0] :
$families = [["Tom", "Alice"], ["Bob", "Kate"]]; print_r($families[0]); // Array ( [0] => Tom [1] => Alice )
Но поскольку элементами массива $families являются вложенные массивы, то чтобы обратиться к элементам внутри этих вложенных массивов, нам необходимо использовать второй индекс — $families[0][0] :
$families = [["Tom", "Alice"], ["Bob", "Kate"]]; echo $families[0][0] . "
"; //Tom echo $families[0][1] . "
"; //Alice echo $families[1][0] . "
"; //Bob echo $families[1][1]; //Kate
То есть выражение $families[0] представляет обращение к первому элементу массива $families — к вложенному массиву [«Tom», «Alice»] , а выражение $families[0][0] представляет обращение к первому элементу вложенного массива, то есть, в данном случае к элементу «Tom».
Перебор многомерного массива:
$user | "; > echo ""; > ?>
Для перебора применяется цикл foreach . Цикл проходит по всем элементам массива $families, передавая каждый элемент в переменную $family :
foreach ($families as $family)
Однако каждый элемент массива $families, который передается в переменную $family , сам является массивом. И чтобы получить элементы из вложенного массива, применяется вложенный цикл:
В итоге при переборе циклом сформируется таблица:
Также можно определять многомерные ассоциативные массивы:
И при выводе мы получим 3 списка:
Чтобы обратиться к элементу данного, также надо указать ключи в квадратных скобках. Например, обратимся к первому элементу в первом массиве. Так как ключ первого массива — «apple», а ключ первого элемента в первом массиве — число 0 (так как мы явным образом не указали ключи):
Подобным образом можно получить второй элемент третьего массива:
Допустим, вложенные массивы также представляют ассоциативные массивы:
Получение и изменение элемента в этом массиве:
// присвоим одному из элементов другое значение $gadgets["phones"]["nokia"] = "Nokia 9"; // выведем это значение echo $gadgets["phones"]["nokia"];
Выше для инициализации массива применялась функция array() , но также можно использовать и сокращенный вариант с квадратными скобками:
$gadgets = [ "phones" => ["apple" => "iPhone 12", "samsumg" => "Samsung S20", "nokia" => "Nokia 8.2"], "tablets" => ["lenovo" => "Lenovo Yoga Smart Tab", "samsung" => "Samsung Galaxy Tab S5", "apple" => "Apple iPad Pro"] ];
Цикл FOREACH в PHP
С помощью цикла FOREACH мы можем перебрать все элементы массива и выполнить для них (или только для некоторых из них) какие-либо действия.
Например, так будет выглядеть вывод названий всех товаров:
'Товар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'] . '
';
Товар1 Товар2 Товар3 Товар4
Всего 2 строчки кода для вывода всех элементов! А теперь разберёмся, как это работает.
Принцип работы цикла FOREACH
Когда мы запускаем цикл, PHP берёт первое значение массива 5 и помещает его в переменную $value. Затем один раз выполняется блок кода echo $value; . Затем PHP делает тоже самое со вторым значением, третьим и т.д.
Получается, команды, принадлежащие циклу FOREACH, будут запущены для каждого элемента отдельно.
Для добавления нескольких команд нужно поместить их в фигурные скобки. Попробуем вывести названия товаров, цена которых выше 1000:
'Товар1', 'price' => 1000]; $products[] = ['name' => 'Товар2', 'price' => 2000]; $products[] = ['name' => 'Товар3', 'price' => 3000]; foreach($products as $product) < if($product['price'] >1000) echo $product['name'] . '
'; >
Получение доступа к ключам массива выглядит следующим образом:
Перебор многомерного массива
Создадим обычный двумерный массив:
Если нужно перебрать элементы только одного подмассива, мы можем сделать так:
foreach($arr['title3'] as $value) echo $value, '
';
Если требуется вывести все подмассивы, мы можем использовать два цикла foreach, один внутри другого:
$values) < echo 'Title: ', $title, '
'; foreach($values as $value) echo 'Value: ', $value, '
'; echo '
'; >
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 выведите все ключи и значения этого массива. Между ключом и значением должна быть строка -> , а между элементами — перенос строки (тег
).
Задача 2
Выведите ключ и набор значений для каждого элемента верхнего уровня. Т.е. в браузере должно отобразиться следующее:
Ключ: 0 | Значения: 1, 2, 3 Ключ: 1 | Значения: 4, 5, 6 Ключ: 2 | Значения: 7, 8, 9
Важно: между значениями должны быть запятые, но перед первым и после последнего их быть не должно. 1,2,3 правильно, 1,2,3, не правильно.