Цикл foreach PHP перебрать массив
Достаточно частая операция во многих языках программирования — это работа с массивами. В PHP для этого есть специальный цикл, foreach, куда необходимо передать массив, на каждой итерации получить значение ключа и самого значения, хотя можно обращаться только к ключам или только к значениям.
Пример записи и результат:
<?php $testarray = array( 1 => 'item1', 2 => 'item2', 3 => 'item3', 4 => 'item4', 5 => 'item1', 6 => 'item6', 7 => 'item7', ); foreach($testarray as $key => $value){ echo 'Ключ: $key - Значение: $value<br>'; } ?>
В примере выше, был объявлен массив, а затем в цикле foreach был перебран. На каждой итерации в $key — попадает ключ массива, а в $value значение.
Результат:
Ключ: 1 - Значение: item1 Ключ: 2 - Значение: item2 Ключ: 3 - Значение: item3 Ключ: 4 - Значение: item4 Ключ: 5 - Значение: item1 Ключ: 6 - Значение: item6 Ключ: 7 - Значение: item7
С простым массивом никаких сложностей, а вот если в значении будет тоже массив, ниже новый пример и результат:
<?php $testarray = array( 1 => 'item1', 2 => 'item2', 3 => 'item3', 4 => 'item4', 5 => 'item1', 6 => 'item6', 7 => array( 1 => 'depth2 item1', 2 => 'depth2 item2', 3 => 'depth2 item3', 4 => 'depth2 item4', ) ); foreach($testarray as $key => $value){ echo 'Ключ: $key - Значение: $value<br>'; } ?>
Результат:
Ключ: 1 - Значение: item1 Ключ: 2 - Значение: item2 Ключ: 3 - Значение: item3 Ключ: 4 - Значение: item4 Ключ: 5 - Значение: item1 Ключ: 6 - Значение: item6 Ключ: 7 - Значение: Array
В итоге мы просто видим, что значение ячейки 7 — это массив, при этом он может быть и более глубокого уровня вложенности. Для переборки многомерного массива, можно воспользоваться конструкцией из примера ниже, где в цикле foreаch проверяется при помощи функции is_array() является ли $value массивом и если так, то запускается еще один foreach внутри первого, где массивом передается $value
<?php $testarray = array( 1 => 'item1', 2 => 'item2', 3 => 'item3', 4 => 'item4', 5 => 'item1', 6 => 'item6', 7 => array( 1 => 'depth2 item1', 2 => 'depth2 item2', 3 => 'depth2 item3', 4 => 'depth2 item4', ) ); foreach($testarray as $key => $value){ if(is_array($value)){ foreach($value as $k => $v){ echo 'Ключ: $k - Значение: $v<br>'; } }else{ echo 'Ключ: $key - Значение: $value<br>'; } } ?>
Результат:
Ключ: 1 - Значение: item1 Ключ: 2 - Значение: item2 Ключ: 3 - Значение: item3 Ключ: 4 - Значение: item4 Ключ: 5 - Значение: item1 Ключ: 6 - Значение: item6 Ключ: 1 - Значение: depth2 item1 Ключ: 2 - Значение: depth2 item2 Ключ: 3 - Значение: depth2 item3 Ключ: 4 - Значение: depth2 item4
Если знать заранее уровень вложенности многомерного массива, то без проблем можно написать жесткую конструкцию, на 2,3,5 или более проверок. Если же это каждый раз может быть разный уровень вложенности, то тогда лучшим решением будет написать рекурсивную функцию. Ниже пример реализации, конечно тут просто вывод на экран, в реальной жизни могут быть применены другие действия.
<?php $testarray = array( 1 => 'item1', 2 => 'item2', 3 => 'item3', 4 => 'item4', 5 => 'item1', 6 => 'item6', 7 => array( 1 => '-- depth2 item1', 2 => '-- depth2 item2', 3 => '-- depth2 item3', 4 => array( 1 => '--- depth3 item1', 2 => '--- depth3 item2', 3 => '--- depth3 item3', 4 => '--- depth3 item4', 5 => '--- depth3 item5', 6 => array( 1 => '--- depth4 item1', 2 => '--- depth4 item2', 3 => '--- depth4 item3', 4 => '--- depth4 item4', 5 => '--- depth4 item5', ), ), ) ); function arrrec($arr){ foreach($arr as $key => $value){ if(is_array($value)){ arrrec($value); }else{ echo 'Ключ: $key - Значение: $value<br>'; } } } arrrec($testarray); ?>
Результат:
Ключ: 1 - Значение: item1 Ключ: 2 - Значение: item2 Ключ: 3 - Значение: item3 Ключ: 4 - Значение: item4 Ключ: 5 - Значение: item1 Ключ: 6 - Значение: item6 Ключ: 1 - Значение: -- depth2 item1 Ключ: 2 - Значение: -- depth2 item2 Ключ: 3 - Значение: -- depth2 item3 Ключ: 1 - Значение: --- depth3 item1 Ключ: 2 - Значение: --- depth3 item2 Ключ: 3 - Значение: --- depth3 item3 Ключ: 4 - Значение: --- depth3 item4 Ключ: 5 - Значение: --- depth3 item5 Ключ: 1 - Значение: --- depth4 item1 Ключ: 2 - Значение: --- depth4 item2 Ключ: 3 - Значение: --- depth4 item3 Ключ: 4 - Значение: --- depth4 item4 Ключ: 5 - Значение: --- depth4 item5
В примере выше создана функция, которая запускает цикл foreach, проверяет является ли значение массивом и если это так, то вызывает сама себя рекурсивно, а если значение не массив, то выводит данные на экран, при таком варианте нам не важно, какая вложенность будет у многомерного массива. Пользуйтесь.
Видео