главная :: основы PHP
Перебор элементов
В РНР существует несколько стандартных функций, предназначенных для перебора элементов массива. В совокупности эти функции
обеспечивают гибкие и удобные средства для быстрой обработки и вывода содержимого массивов. Вероятно, вы будете часто использовать
эти функции, поскольку они лежат в основе практически всех алгоритмов работы с массивами.
reset( )
Функция reset( ) переводит внутренний указатель текущей позиции в массиве к первому элементу. Кроме того, она возвращает значение
первого элемента. Синтаксис функции reset( ):
mixed reset (array массив)
Рассмотрим следующий массив:
$fruits = array("apple", "orange", "banana");
Допустим, указатель текущей позиции в этом массиве установлен на элемент "orange". Команда:
$a_fruit = reset($fruits);
вернет указатель в начало массива, то есть на элемент "apple", и вернет это значение, если результат вызова reset( ) используется в программе.
Возможен и упрощенный вариант вызова:
reset($fruits);
В этом случае указатель переходит к первому элементу массива, а возвращаемое значение не используется.
each ( )
Функция each( ) при каждом вызове выполняет две операции: она возвращает пару «ключ/значение», на которую ссылается указатель текущей
позиции, и перемещает указатель к следующему элементу. Синтаксис функции each( ):
array each (array массив)
Для удобства each ( ) возвращает ключ и значение в виде массива из четырех элементов; ключами этого массива являются 0, 1, value и key.
Возвращаемый ключ ассоциируется с ключами 0 и key, а возвращаемое значение — с ключами 1 и value.
В следующем примере функция each ( ) возвращает элемент, находящийся в текущей позиции:
// Объявить массив из пяти элементов
$spices = array("parsley", "sage", "rosemary", "thyme", "pepper");
// Установить указатель на первый элемент массива
reset($spices);
// Создать массив $a_sp1ce. состоящий из четырех элементов
$a_spice = each($spices);
В результате выполнения приведенного фрагмента массив $a_spice будет содержать следующие пары «ключ/значение»:
0 => 0;
1 => "parsley";
key => 0;
value => "parsley".
После этого строку "parsley" можно вывести любой из следующих команд:
print $a_spice[1]: print $a_spice["value"];
Функция each() обычно используется в сочетании с list( ) в циклических конструкциях для перебора всех или некоторых элементов массива.
При каждой итерации each( ) возвращает либо следующую пару «ключ/значение», либо логическую ложь при достижении последнего элемента
массива. Вернемся к массиву $spices; чтобы вывести все элементы на экран, можно воспользоваться следующим сценарием:
// Сбросить указатель текущей позиции
reset($spices);
// Перебрать пары "ключ/значение", ограничиваясь выводом значения
while (list ($key, $val) = each ($spices) ) :
print "$val "
endwhile;
Ниже приведен более интересный пример использования each( ) в сочетании с другими функциями, описанными в этой главе. Листинг 5.1
показывает, как при помощи этих функций вывести отформатированную таблицу стран и языков.
Листинг 5.1. Построение таблицы HTML по содержимому массива
// Объявить ассоциативный массив стран и языков $languages = array ("Country" => "Language",
"Spain" => "Spanish",
"USA" => "English",
"France" => "French",
"Russia" => "Russian");
// Начать новую таблицу
print " ";
// Переместить указатель к позиции первого элемента
reset ($languages);
// Прочитать первый ключ и элемент
$hdl = key ($languages);
Shd2 = $languages[$hd1];
// Вывести первый ключ и элемент в виде заголовков таблицы
print "$hd1 | $hd2 | ";
next($languages);
// Выводить строки таблицы с ключами и элементами массива
while (list ($ctry,$lang) = each ($languages)) :
print "Sctry | $lang | ";
endwhile;
// Завершить таблицу print " ";
?>
В результате выполнения этого кода будет построена следующая таблица HTML.
Country
Language
Spain
Spanish
USA
English
France
French
Russia
Russian
Этот пример дает представление о самой сильной стороне РНР — возможности объединения динамического кода с HTML для получения
наглядного, отформатированного представления прочитанных данных.
end( )
Функция end( ) перемещает указатель к позиции последнего элемента массива. Синтаксис функции end( ):
end (array массив)
next( )
Функция next ( ) смещает указатель на одну позицию вперед, после чего возвращает элемент, находящийся в новой позиции. Если в результате
смещения
указатель выйдет за пределы массива, next ( ) возвращает ложное значение. Синтаксис функции next ( ):
mixed next (array массив)
Недостаток функции next ( ) заключается в том, что ложное значение возвращается и для существующих, но пустых элементов
массива. Если вы хотите провести обычный перебор, воспользуйтесь функцией each( ).
prev( )
Функция prev( ) аналогична next ( ) за одним исключением: указатель смещается на одну позицию к началу массива, после чего возвращается
элемент, находящийся в новой позиции. Если в результате смещения указатель окажется перед первым элементом массива, prev( ) вернет
ложное значение. Синтаксис функции prev( ):
mixed prev (array массив)
Недостаток функции prev( ) заключается в том, что ложное значение возвращается и для существующих, но пустых элементов
массива. Если вы хотите провести обычный перебор, воспользуйтесь функцией each( ).
array_walk( )
Функция array_walk( ) позволяет применить функцию к нескольким (а возможно, всем) элементам массива. Синтаксис функции array_walk( ):
int array_walk(array массив, string имя_функции [, mixed данные])
Функция, заданная параметром имя_функции, может использоваться для различных целей — например, для поиска элементов с
определенными характеристиками или модификации содержимого массива. В ассоциативных массивах функция имя_функции должна
получать минимум два параметра — элемент массива и ключ. Если указан необязательный третий параметр данные, он становится третьим
параметром. В следующем примере функция array_walk( ) используется для удаления дубликатов из массива:
function delete_dupes($element) {
static $last=""; if ($element == $last)
unset($element); else . ''
$last=$element:
}
$emails = array("blah@blah.com", "chef@wjgilmore.com", "blah@blah.com");
sort($emails);
reset($emails);
array_walk($emails,"delete_dupes");
// $emails = array("chef@wjgilmore.com", "blah@blah.com");
array_reverse( )
Функция array_reverse( ) позволяет легко перейти к противоположному порядку элементов, составляющих массив. Синтаксис функции
array_reverse( ):
array array_reverse(array массив)
Рассмотрим пример использования функции array_reverse( ):
$us_wireproducers = array ("California", "Oregon", "New York". "Washington");
$us_wine_producers - array_reverse (Sus_wine_producers);
// $us_wine_producers = array ("Washington". "New York", "Oregon". "California");
При вызове array_reverse( ) для ассоциативного массива пары «ключ/значение» сохраняются, изменяется только порядок элементов массива.
array_flip( )
Функция array_flip( ) меняет местами ключи и значения элементов массива. Синтаксис функции array_flip( ):
array array_flip(array массив)
В следующем примере функция array_flip( ) меняет местами все ключи и значения элементов:
$languages = array("Spain" => "Spanish", "France" => "French", "Italy" => "Italian");
$languages = array_flip($languages);
// $languages = array("Spanish" => "Spain", // "French" => "France", // "Italian" => "Italy");
Помните: функция array_flip( ) не изменяет порядок элементов массива. Для этой цели используется функция array_reverse( ).
|