- Перебор элементов, Размер

Печать: Шрифт: Абв Абв Абв
admin 27 Февраля 2006 в 16:19:07
Перебор элементов

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

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 <br>"
endwhile;
?>


Ниже приведен более интересный пример использования each( ) в сочетании с другими функциями, описанными в этой главе. Листинг 5.1 показывает, как при помощи этих функций вывести отформатированную таблицу стран и языков.

Листинг 5.1. Построение таблицы HTML по содержимому массива

<?
// Объявить ассоциативный массив стран и языков $languages = array ("Country" => "Language",
"Spain" => "Spanish",
"USA" => "English",
"France" => "French",
"Russia" => "Russian");
// Начать новую таблицу
print "<table border=l>";
// Переместить указатель к позиции первого элемента
reset ($languages);
// Прочитать первый ключ и элемент
$hdl = key ($languages);
Shd2 = $languages[$hd1];
// Вывести первый ключ и элемент в виде заголовков таблицы
print "<tr><th>$hd1</th><th>$hd2</th></tr>";
next($languages);
// Выводить строки таблицы с ключами и элементами массива
while (list ($ctry,$lang) = each ($languages)) :
print
"<tr><td>Sctry</td><td>$lang</td></tr>";
endwhile;
// Завершить таблицу print "</table>";
?>


В результате выполнения этого кода будет построена следующая таблица HTML.

CountryLanguage
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( ).

Размер массива

Наличие информации о текущем размере массива часто позволяет повысить эффективность сценария. Вероятно, размер массива чаще всего используется при циклическом переборе элементов:

<?
$us_wine_producers
= array ("Washington". "New York", "Oregon", "California");
for (
Si = 0; Si < sizeof ($us_wine_producers); $i++) :
print
"$us_wine_producers[$i]";
endfor;
?>


Поскольку массив $us_wine_producers индексируется целыми числами, мы можем воспользоваться циклом for для циклического увеличения переменной-счетчика ($i) и вывода каждого элемента в массиве.

sizeof()

Функция sizeof() возвращает количество элементов в массиве. Синтаксис функции sizeof ( ):

int sizeof (array массив)

Вероятно, функция sizeof ( ) будет часто встречаться в ваших web-приложениях. Ниже приведен краткий пример ее использования (кстати, предыдущий пример тоже относится к числу стандартных применений sizeof ( )):

<?
$pasta
= array("bowties", "angelhair", "rigatoni");
$pasta_size = sizeof($pasta);
// $pasta_size = 3
?>


У функции sizeof ( ) существует и другая, расширенная форма — count() (см. ниже).

count()

Функция count( ) выполняет ту же операцию, что и sizeof ( ), — она возвращает количество значений, содержащихся в массиве. Синтаксис функции count ( ):

int count (mixed переменная)

Единственное различие между sizeof ( ) и count( ) заключается в том, что в некоторых ситуациях count ( ) возвращает дополнительную информацию:

если переменная существует и является массивом, count ( ) возвращает количество элементов в массиве;
если переменная существует, но не является массивом, функция возвращает значение 1;
если переменная не существует, возвращается значение 0.

array_count_values('')

Функция array_count_values(') является разновидностью sizeof ( ) и count ( ). Вместо общего количества элементов она подсчитывает количество экземпляров каждого значения в массиве. Синтаксис функции array_count_values('):

array array_count_values('array массив');

В возвращаемом массиве ключами будут значения исходного массива, а значениями — их частоты:

<?
$states
= аrrау("ОН", "ОК", "СА", "РА", "ОН", "ОН", "РА", "АК");
$state_freq = array_count_values('$states');
?>


Массив $state_freq заполняется следующими ассоциативными парами «ключ/значение»:

<? $state_freq = аrrау("ОН" => 3, "ОК" => 1, "СА" => 1, "РА" => 2, "АК" => 1); ?>

Добавить сообщение
Чтобы добавлять комментарии зарeгиcтрирyйтeсь