PHP 4 на практике

       

Перебор элементов


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

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.

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


    Содержание раздела