ГЛАВА 5. Массивы
Перебор элементов
В РНР существует несколько стандартных функций, предназначенных для перебора элементов массива. В совокупности эти функции обеспечивают гибкие и удобные средства для быстрой обработки и вывода содержимого массивов. Вероятно, вы будете часто использовать эти функции, поскольку они лежат в основе практически всех алгоритмов работы с массивами.
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);
$hd2 = $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.
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().
Назад |
Содержание раздела |
Общее Содержание |
Вперед
Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
|