METANIT.COM

Как сделать вложенный цикл foreach в for?

Создаю в папке с помощью цикла for документы с разным наполнением. Это наполнение подтягивают из json.
Все отлично работает, но когда дело доходит до того момента, когда из json нужно перебрать массивом данные, скрипт останавливает работу. Как выполнить foreach внутри for?

  

'.$json->updates[$i]->title_ru. '

'.$json->updates[$i]->title_en. '

'.$json->updates[$i]->year. '

'.$json->updates[$i]->duration->human. '

'.$json->updates[$i]->kinopoisk_id. '

'.$json->updates[$i]->token. '

'.$json->updates[$i]->source_type. '

'.$json->updates[$i]->iframe_url. '

'.$json->updates[$i]->translator. '

'.$json->updates[$i]->added_at. '

'; ?> updates[$i]->material_data->countries as $countriess) < ?>'.$countriess.',';?> '; $fp = fopen("empty$i.html", "w"); fwrite($fp, $text); fclose($fp); > ?>

У вас проблема в том, что не у каждого объекта есть material_data. Нужно поставить проверку на isset, и в случае true уже запускать цикл foreach

$file = file_get_contents("https://protectorat.cc/api/movies_updates.json?api_token=fa64680c5213b5f16d789133afce4137"); $json = json_decode($file); for($i = 0; $i  

'.$json->updates[$i]->title_ru. '

'.$json->updates[$i]->title_en. '

'.$json->updates[$i]->year. '

'.$json->updates[$i]->duration->human. '

'.$json->updates[$i]->kinopoisk_id. '

'.$json->updates[$i]->token. '

'.$json->updates[$i]->source_type. '

'.$json->updates[$i]->iframe_url. '

'.$json->updates[$i]->translator. '

'.$json->updates[$i]->added_at. '

'; if(isset($json->updates[$i]->material_data))< foreach ($json->updates[$i]->material_data->countries as $countriess) < echo $countriess; >> $fp = fopen("empty$i.html", "w"); fwrite($fp, $text); fclose($fp); >

Вообще, я бы посоветовал декодировать файл с аргументом true:
$json = json_decode($file, true);
, чтобы на выходе получить ассоциативный массив

Источник

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 ); // разорвать ссылку на последний элемент
?>

Указатель на $value возможен, только если на перебираемый массив можно ссылаться (т.е. если он является переменной). Следующий код не будет работать:

Ссылка $value на последний элемент массива остается даже после того, как оператор foreach завершил работу. Рекомендуется уничтожить ее с помощью функции unset() .

Замечание:

Оператор foreach не поддерживает возможность подавления сообщений об ошибках с помощью префикса ‘@’.

Вы могли заметить, что следующие конструкции функционально идентичны:

$arr = array( «one» , «two» , «three» );
reset ( $arr );
while (list(, $value ) = each ( $arr )) echo «Значение: $value
\n» ;
>

foreach ( $arr as $value ) echo «Значение: $value
\n» ;
>
?>

Следующие конструкции также функционально идентичны:

$arr = array( «one» , «two» , «three» );
reset ( $arr );
while (list( $key , $value ) = each ( $arr )) echo «Ключ: $key ; Значение: $value
\n» ;
>

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:

Источник

Цикл 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, не правильно.

Источник

Вложенные циклы foreach php

В предыдущих примерах рассматривались только одномерные массивы, где значения элементов представляли числа, строки. Но в 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».

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

      "; foreach ($family as $user) < echo ""; > echo ""; > ?>
$user

Для перебора применяется цикл foreach . Цикл проходит по всем элементам массива $families, передавая каждый элемент в переменную $family :

foreach ($families as $family)

Однако каждый элемент массива $families, который передается в переменную $family , сам является массивом. И чтобы получить элементы из вложенного массива, применяется вложенный цикл:

В итоге при переборе циклом сформируется таблица:

Многомерные массивы в PHP

Также можно определять многомерные ассоциативные массивы:

И при выводе мы получим 3 списка:

Многомерные ассоциативные массивы в PHP

Чтобы обратиться к элементу данного, также надо указать ключи в квадратных скобках. Например, обратимся к первому элементу в первом массиве. Так как ключ первого массива — «apple», а ключ первого элемента в первом массиве — число 0 (так как мы явным образом не указали ключи):

Подобным образом можно получить второй элемент третьего массива:

Допустим, вложенные массивы также представляют ассоциативные массивы:

Многомерные ассоциативные массивы в PHP и foreach

Получение и изменение элемента в этом массиве:

// присвоим одному из элементов другое значение $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"] ];

Источник

Читайте также:  Заполнить массив случайными целыми числами python
Оцените статью