Оператор цикла Foreach в PHP. Как перебрать любой вид массива?

оператор цикла foreach в php. как перебрать любой вид массива?

Использование цикла foreach

Перебор элементов массива[1] – это одна из часто встречающихся задач при написании PHP-скриптов. Реализовать ее можно с помощью любого из существующих видов циклов, но есть специализированный оператор цикла foreach, предназначенный строго для этой цели.

Существует два синтаксиса определения оператора foreach. При использовании первого в теле цикла доступно только значение элемента, а второго – и ключ, и значение. Ниже мы приводим два примера использования, а сразу за ними даем подробный разбор синтаксиса.

//Создаем массив, ключами которого являются страны,
//а значениями их столицы
$countries = [
    'Франция' => 'Париж',
    'Россия' => 'Москва',
    'Украина' => 'Киев'
];

//Используем первый вид синтаксиса для вывода наз-
//ваний городов
echo 'Мои любимые города:';
foreach($countries as $capital) {
    echo '<br>'. $capital;
}
/*
* Результат:
* Мои любимые города:
* Париж
* Москва
* Киев
*/

//Используем второй вид синтаксиса для вывода стран
//и их столиц
echo 'Страны и их столицы:';
foreach($countries as $country => $capital) {
    echo '<br>'. $country .' - '. $capital;
}
/*
* Результат:
* Страны и их столицы:
* Франция - Париж
* Россия - Москва
* Украина - Киев
*/

Правила использования оператора цикла foreach:

  1. Конструкция начинается с ключевого слова «foreach», за которым следуют блок инициализации.
  2. Блок инициализации располагается внутри круглых скобок и состоит из двух частей, разделенных ключевым словом «as». В общем виде он записывается как «$имя_массива as $переменная_ключа => $переменная_значения».
  3. В левой части выражения инициализации (до ключевого слова «as») мы указываем имя переменной содержащей массив. Именно он и будет перебираться в цикле.
  4. Правая часть выражения (после ключевого слова «as») содержит определение переменных, в которые на каждом шаге цикла будут помещаться ключи и значения текущего элемента. Если нам нужны только значения, эта часть выражения записывается в виде «$переменная_значения», а если и ключ, и значение то «$переменная_ключа => $переменная_значения».
  5. После блока инициализации располагаются фигурные скобки, между которыми задается программный код, требующий выполнения для каждого элемента массива.

Расширенные возможности

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

//Создаем массив для перебора в цикле
$testArray = [ 'цвет' => 'зеленый', 'вкус' => 'сладкий' ];

//Пытаемся изменить значение каждого элемента массива
foreach($testArray as $key => $value) {
    $value = 'Новое значение';
}

//Выводим структуру массива, которая должна быть
//измененной. Однако это не так
var_dump($testArray);
/*
* Результат:
* array(2) {
*     ["цвет"]=> string(14) "зеленый"
*     ["вкус"]=> string(14) "сладкий"
* }
*/

Чтобы изменять значения элементов массива, в процессе перебора вы можете передать их по ссылке. После выхода из цикла массив зафиксирует все изменения. Для передачи значения по ссылке, перед его определением в блоке инициализации нужно поставить символ «&».

//Создаем массив для перебора в цикле
$testArray = [ 'животное' => 'кот', 'окрас' => 'черный' ];

//Пытаемся изменить значение каждого элемента массива
//, но уже передаем значение по ссылке
foreach($testArray as $key => &$value) {
    $value = 'Значение не определено...';
}

//Просматриваем измененную структуру массива
var_dump($testArray);
/*
* Результат:
* array(2) {
*     ["животное"]=> string(45) "Значение не определено..."
*     ["окрас"]=> string(45) "Значение не определено..."
* }
*/

Важно
Передача значений элементов по ссылке в оператор цикла foreach ускоряет его работу и экономит оперативную память. Это происходит, потому что нет накладных расходов на создание копии. Но мы настоятельно не рекомендуем использовать этот трюк повсеместно! Делайте так, если есть действительная необходимость.

Дело в том, что такое поведение может запутать других программистов, а непродуманная логика изменения массива может привести к трудноуловимым ошибкам.

Термины, использованные в статье

  1. Перебор массива — прохождение по всем элементам массива в цикле с целью получения и обработки их ключей и значений. При этом на каждом шаге цикла обрабатывается лишь один элемент, а порядок их обработки соответствует порядку расположения в массиве.

Последние публикации