PhpBuilder.ru
ваш путеводитель по веб программированию
Главное меню
Уроки по PHP

Урок 18. Способы перебора элементов массивов
При работе с массивами в языке программирования php множество задач решается с помощью перебора их элементов. Для этого используют рассмотренные в прошлых уроках циклические конструкции (for, whilе…) или конструкцию foreach, которая была специально создана для работы с массивами.
Давайте для начала рассмотрим способ перебора массива с помощью цикла whilе:
В результате работы этого скрипта мы увидим на экране следующую информацию:
Скорее всего в данном примере Вы столкнулись с несколькими незнакомыми или непонятными моментами. Поэтому давайте рассмотрим этот скрипт более детально.
Пример выполнения этой ж задачи с помощью цикла for:
Циклы удобно использовать для перебора индексных массивов, так как выполняются операции с целочисленными индексами. Эту задачу также можно решить и с помощью конструкции foreach. Всего есть 2 способа записи данной конструкции:
Чаще всего конструкцию foreach в php используют для перебора ассоциативных массивов. Рассмотрим следующий пример:
В некоторых случаях способы перебора элементов массива комбинируют. Давайте организуем перебор элементов многомерного массива:
bool print_r (mixed expression[, bool return]);
Пример использования на практике:
Рекомендуем самостоятельно поэксперементировать с данной php функцией.
Перебор массива в php
Пусть у нас имеется ассоциативный массив, ключами которого являются страны, а значениями — их столицы. Необходимо перебрать данный массив. Воспользуемся такой конструкцией:
В ассоциативных массивах есть такое понятия, как текущий элемент. Функция reset() ставит текущий элемент на первый элемент массива. Функция key() возвращает ключ, который имеет текущий элемент. Функция next() двигается к следующему элементу массива (сдвигает текущую позицию на один элемент вперед). Отсюда вытекает ещё одно свойство массива — это направленность.
Также иногда возникает необходимость перебрать элемент с конца. Пример:
Идея прямого перебора заключается в том, чтобы сразу получать и ключ, и значение. Есть старый вариант прямого перебора:
В 4 версии языка PHP была добавлена новая инструкция — foreach :
Самый простой вариант перебора. Данный способ рекомендуется использовать везде. Стоит отметить, что цикл foreach перед началом своей работы создаёт копию массива и работает уже с копией. Если мы потом выведем наш массив, то никаких изменений в нём не будет.
Для того, чтобы работать не с копией, а и исходным массивом, необходимо использовать ссылочный тип данных. Для примера: создадим список из трех числовых элементов, затем в цикле foreach возведём данные числа в квадрат. После всего этого выведем список:
Давайте теперь заставим массив измениться, поставив ссылочный оператор & :
В данной статье вы узнали различные варианты перебора массива в php.
На связи был Алексей Гулынин, оставляйте свои комментарии, увидимся в следующих статьях.
foreach
Конструкция foreach предоставляет простой способ перебора массивов. Foreach работает только с массивами и объектами, и будет генерировать ошибку при попытке использования с переменными других типов или неинициализированными переменными. Существует два вида синтаксиса:
Первый цикл перебирает массив, задаваемый с помощью array_expression. На каждой итерации значение текущего элемента присваивается переменной $value и внутренний указатель массива увеличивается на единицу (таким образом, на следующей итерации цикла работа будет происходить со следующим элементом).
Второй цикл будет дополнительно соотносить ключ текущего элемента с переменной $key на каждой итерации.
Когда оператор foreach начинает исполнение, внутренний указатель массива автоматически устанавливается на первый его элемент Это означает, что нет необходимости вызывать функцию reset() перед использованием цикла foreach.
Так как оператор foreach опирается на внутренний указатель массива, его изменение внутри цикла может привести к непредсказуемому поведению.
Для того, чтобы напрямую изменять элементы массива внутри цикла, переменной $value должен предшествовать знак &. В этом случае значение будет присвоено по ссылке.
Указатель на $value возможен, только если на перебираемый массив можно ссылаться (т.е. если он является переменной). Следующий код не будет работать:
Оператор foreach не поддерживает возможность подавления сообщений об ошибках с помощью префикса ‘@’.
Вы могли заметить, что следующие конструкции функционально идентичны:
Следующие конструкции также функционально идентичны:
Вот еще несколько примеров, демонстрирующие использование оператора:
/* Пример 1: только значение */
/* Пример 2: значение (для иллюстрации массив выводится в виде значения с ключом) */
$i = 0 ; /* только для пояснения */
/* Пример 3: ключ и значение */
/* Пример 4: многомерные массивы */
$a = array();
$a [ 0 ][ 0 ] = «a» ;
$a [ 0 ][ 1 ] = «b» ;
$a [ 1 ][ 0 ] = «y» ;
$a [ 1 ][ 1 ] = «z» ;
/* Пример 5: динамические массивы */
Распаковка вложенных массивов с помощью list()
В PHP 5.5 была добавлена возможность обхода массива массивов с распаковкой вложенного массива в переменные цикла, передав list() в качестве значения.
Результат выполнения данного примера:
Результат выполнения данного примера:
Website-create.ru
Продолжаем изучение массивов. В прошлых статьях мы уже научились объявлять массивы; разобрались: для чего они нужны и где могут использоваться; познакомились с многомерными и ассоциативными массивами. Теперь самое время поговорить о переборе элементов массива.
Зачастую бывает необходимо перебрать все элементы массива и проделать с ними какое-либо действие.
Делать это можно по-разному: при помощи циклов и без. Например, в прошлой статье мы получали все ключи ассоциативного массива, перебирали и выводили их при помощи цикла foreach. Там мы не стали останавливаться на теме перебора элементов массива при помощи цикла, потому что это достойно отдельной темы.
Сегодня, как раз, мы и поговорим о том, как можно перебирать элементы массива. Вы познакомитесь с достаточным количеством новых функций. Ну что ж, давайте начнем!
Для начала поговорим о переборе элементов массива при помощи циклов.
Для этого используются 3 вида циклов for, foreach и while.
Перебор элементов массива. Цикл for()
Для перебора элементов массива-списка, можно сделать следующее:
1. Сначала мы объявляем сам массив;
2. Далее узнаем число элементов массива и заносим это значение в переменную;
3. После объявляем цикл for, где в круглых скобках устанавливаем счетчик (объявляется переменная «i» со значением ноль, если эта переменная меньше общего числа элементов массива, то каждую итерацию значение «i» будет увеличиваться на единицу);
4. А в теле цикла уже можно прописать, что делать с каждым элементом массива. Можно, например, просто вывести их на экран.
Все вышеперечисленное иллюстрирует следующий код:
В результате его выполнения мы увидим на экране значения элементов массива, выведенные каждое с новой строки.
Цикл for и ассоциативные массивы
А вот для перебора элементов ассоциативного массива такой способ уже не подойдет по той простой причине, что индексами ассоциативного массива являются не числа, а строки.
Чтобы перебрать элементы ассоциативного массива в цикле for можно воспользоваться следующей конструкцией:
Как видите, мы объявили ассоциативный массив.
Далее в цикле for мы используем три новые функции:
reset() – устанавливает указатель на первый элемент массива;
next() – перемещает указатель на один элемент массива вперед;
key() – возвращает ключ текущего элемента массива.
А потом в теле цикла мы выводим индекс элемента массива, стрелку и значение элемента массива. Каждую пару индекс-значение выводим с новой строки.
Также вместо reset() можно использовать end(), тогда указатель будет установлен на последний элемент массива. Но в таком случае нужно и вместо next() использовать prev(), чтобы перемещать указатель не вперед, а назад.
Так мы можем перебрать элементы ассоциативного массива в обратном порядке.
Как Вы, наверное, знаете, цикл for используется далеко не только для работы с массивами.
А вот следующий цикл, который мы рассмотрим применяется как раз исключительно для работы с массивами.
Перебор элементов массива. Цикл foreach()
Цикл foreach() позволяет нам работать как с обычными массивами-списками, так и с ассоциативными.
Вот пример работы цикла для перебора элементов простого массива-списка с выводом всех значений элементов массива на экран.
В итоге на экране мы увидим все значения элементов этого массива.
Для ассоциативного массива эта конструкция останется точно такой же (за исключением, конечно, что в начале мы объявим не массив-список, а ассоциативный массив) и опять же мы увидим на экране все значения элементов массива.
А вот если мы захотим вывести на экран не только значения элементов, но и их ключи (Вы помните, что у ассоциативных массивов индексы представляют собой строковое значение), то данный цикл нужно будет немного усовершенствовать.
И в данном случае мы увидим на экране пару: ключ – значение, между которыми будет стрелка.
Перебор элементов массива. Цикл while()
Еще один цикл, который мы можем использовать для перебора всех элементов массива – это цикл while().
При этом нам помогут еще две функции, которые мы будет использовать совместно с этим циклом. Это функции list() и each().
В случае с массивами-списками мы будем использовать данный цикл — вот так:
Наверное, Вы уже догадались, что на экране мы увидим значения элементов массива.
Здесь функция each() возвращает текущий элемент массива, а после перемещает указатель.
В случае с ассоциативным массивом процедура остается прежней, если нам нужно получить только значения элементов массива. Но если мы хотим получить также и ключ каждого элемента, то код нужно будет слегка дополнить. Вот таким образом:
Вот так мы получим и ключи и значения.
Перебор элементов массива без использования циклов
Можно осуществлять перебор элементов массива и без использования циклов. Для этого мы будем использовать специальную функцию array_walk().
Эта функция работает следующим образом: она позволяет последовательно применять ко всем элементам массива отдельно созданную функцию. То есть сначала мы создаем самостоятельную функцию, а потом при помощи array_walk() применяем ее к каждому элементу массива. Причем в самостоятельно созданной функции мы можем прописать любое нужное нам действие над элементом массива.
Давайте создадим функцию, которая будет выводить ключ и значение элемента массива на экран, а потом при помощи array_walk() применим ее к каждому элементу нашего массива.
В итоге на экране мы увидим следующее.
Вот, пожалуй, и все, что я хотела Вам рассказать о переборе элементов массива.
Для того, чтобы лучше понять, как это все работает, советую каждый пример проделать самостоятельно, а возможно, и попрактиковаться со своими собственными примерами.
В следующей статье мы поговорим о добавлении и удалении элементов массива в разные его места.
Жду Ваших комментариев. Делитесь статьей с друзьями при помощи кнопок социальных сетей и подписывайтесь на обновление блога, чтобы всегда быть в курсе новых публикаций.
С Вами была Анна Котельникова. Успехов и до новых встреч!
Цикл php обработки перебора массива
You can also use the alternative syntax for the foreach cycle:
I cannot stress this point of the documentation enough! Here is a simple example of exactly why this must be done:
Even though it is not mentioned in this article, you can use «break» control structure to exit from the «foreach» loop.
WARNING: Looping through «values by reference» for «extra performance» is an old myth. It’s actually WORSE!
?>
Which do you think is faster?
Lots of people think the answer is two() because it uses «reference to value, which it doesn’t have to copy each value when it loops».
Well, that’s totally wrong!
Here’s what actually happens:
Alright, so what’s the second version doing? The beloved «iterate values by reference»?
— This function takes an array as argument ($arr).
— The array function argument itself isn’t passed by reference, so the function knows it isn’t allowed to modify the original at all.
— Then the foreach loop happens. The array itself wasn’t passed by reference to the function, so PHP knows that it isn’t allowed to modify the outside array.
— But it also sees that you want to look at all VALUES by reference (&$val), so PHP says «Uh oh, this is dangerous. If we just give them references to the original array’s values, and they assign some new value to their reference, they would destroy the original array which they aren’t allowed to touch!».
— So PHP makes a FULL COPY of the ENTIRE array and ALL VALUES before it starts iterating. YIKES!
Therefore: STOP using the old, mythological «&$val» iteration method! It’s almost always BAD! With worse performance, and risks of bugs and quirks as is demonstrated in the manual.
You can always manually write array assignments explicitly, without references, like this:

