Работа с курсором (указатель) массива 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Работа с курсором (указатель) массива



end() next() prev() current() key() each()

 

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

Функция end() выполняет действие, обратное функции reset() – переносит курсор в конец массива. Синтаксис функции аналогичен синтаксису функции reset():

End()

Синтаксис:

mixed end ( array array arr )

 

Next()

Функция next() производит перенос курсора массива вперед на одну позицию.

Синтаксис:

mixed next ( array array arr )

Т.е. эта функция перемещает курсор массива на следующий элемент, при этом возвращая значение элемента, на котором находился курсор до перемещения. Если элементов в массиве больше не осталось, функция возвращает false. При работе с этой функцией надо не забывать про один моментик, а именно: false также возвращается, если курсору повстречается элемент с пустым значением. Так что, если вы хотите работать с массивами, содержащими пустые элементы, то используйте лучше функцию each(), о которой мы поговорим через несколько абзацев.

 

Prev()

Функция prev() производит перенос курсора назад на одну позицию. Синтаксис и работа функции полностью аналогичны функции next().

Синтаксис:

mixed prev ( array array arr )

 

Current()

Для определения текущего элемента массива, без изменения положения курсора, используется функция current().

Синтаксис:

mixed current ( array array arr )

Функция current() возвращает значение элемента, на котором в данный момент находится курсор массива, при этом не сдвигая курсор. В том случае, если курсор оказался за пределами массива, или массив состоит из пустых элементов, функция возвратит false.

Полным синонимом функции current() является функция pos().

 

Key()

Функция key() возвращает индекс текущего элемента массива.

Синтаксис:

mixed key ( array array arr )

 

Ну а теперь поговорим об обещанной функции each().

Each()

Синтаксис:

array each ( array array arr )

Функция each() возвращает пару "индекс - значение" текущего элемента массива и сдвигает курсор массива на следующий элемент. При этом, как видно, функция возвращает массив, причем он имеет четыре элемента:

· [1] => "значение"

· [value] => "значение"

· [0] => индекс

· [key] => индекс

Если курсор достиг конца массива, функция возвращает false. Посмотрим, как работает эта функция:

Пример:

<? $name = array ( "maks", "igor", "sergey" ); $each_name = each ( $name ); print_r ( $each_name ); echo( "<br>" ); $each_name = each ( $name ); print_r ( $each_name ); echo( "<br>" ); $each_name = each ( $name ); print_r ( $each_name );?>

И что мы получили:

Результат:

Array ([1] => maks [value] => maks [0] => 0 [key] => 0) Array ([1] => igor [value] => igor [0] => 1 [key] => 1) Array ([1] => sergey [value] => sergey [0] => 2 [key] => 2)

 

Функцию each() можно использовать в паре с функцией list() для перебора элементов массива. К примеру, вот так:

Пример:

<? $name = array ( "maks", "igor", "sergey" ); reset ( $name ); while ( list ( $key, $val ) = each ( $name )) { echo ( "$key = $val<br>" ); }?>

И вот что на выходе:

Результат:

0 = maks 1 = igor 2 = sergey

 

Функция array_walk()

array_walk()

Достаточно важная функция, позволяющая применять пользовательскую функцию к каждому элементу массива.

Синтаксис:

bool array_walk ( array arr, callback func [, mixed userdata] )

Как видно из синтаксиса этой функции, она применяет пользовательскую функцию func к каждому элементу массива arr. В пользовательскую функцию передаются два или три аргумента: значение текущего элемента, его индекс и аргументuserdata. Последний аргумент является необязательным. Заметим, что в случае, если func требует более трех аргументов, при каждом ее вызове будет выдаваться предупреждение, и, чтобы они не выдавались, нужно поставить знак "@" перед функцией array_walk(). Заметим также, что функция func получает значения и индексы массива arr таким образом, что не может их изменять. Если возникает такая необходимость, нужно передавать аргумент arr по ссылке. В этом случае все изменения отразятся в массиве.

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

Пример:

<? $name = array ( "m"=>"maks", "i"=>"igor", "s"=>"sergey" ); function print_array ( $item, $key ) { echo "$key => $item<br>\n"; } array_walk ( $name, 'print_array' );?>

И что вышло:

Результат:

m=>maks i=>igor s=>sergey

 

Важное замечание. Вообще говоря, в приведенном выше коде, есть, скажем так неточность. А именно – мы не установили курсор массива в начало массива, и перед тем, как вызывать функцию array_walk() надо вызывать функциюreset() для этой цели, потому что array_walk() начинает работать с того элемента, на котором находится курсор массива.

Давайте теперь возьмем массив, и увеличим значения каждого его элемента на единицу.

Пример:

<? $number = array ( "1"=>"15", "2"=>"20", "3"=>"25" ); function printarray ( $item, $key )    { echo "$key=>$item<br>\n"; } function add_array ( &$item, $key )     // параметр $item передаем по ссылке, так как            // его нам надо изменять { $item = $item + 1; } echo( "Before:<br>" ); array_walk ( $number, 'printarray' ); echo( "After:<br>" ); array_walk ( $number, 'add_array' ); array_walk ( $number, 'printarray' );?>

Результат:

Before: 1=>15 2=>20 3=>25 After: 1=>16 2=>21 3=>26

 

Задания к лабораторной работе №5:

Задание 1.

1. Написать программу для вычисления:

2. Написать программу для вычисления:

3. Дано 100 целых чисел. Распечатать их в обратном порядке по 6 чисел в строке.

4. Программа. Дана последовательность из 100 различных целых чисел. Найти сумму чисел этой последовательности, расположенных между максимальным и минимальным числами (в сумму включить оба этих числа).

5. Программа. Даны координаты n точек на плоскости: , (n=20). Найти номера двух точек, расстояние между которыми наибольшее (считать, что такая пара точек единственная).

6. Проверить, имеется ли в данном одномерном числовом массиве хотя бы одна пара чисел, совпадающих по величине. Если имеется, вывести на печать их индексы.

7. Дан числовой массив a1,a2,,..,an. Определить, сколько раз встречается в этой таблице максимальное по величине число.

8. Дан числовой массив a1,a2,,..,an. Найти сумму его элементов расположенных между максимальным и минимальным членами (включая оба этих числа).

9. Элементы числового массива циклически сдвинуть на две позиции влево.

10. Даны две последовательности по 30 целых чисел в каждой. Найти наименьшее среди тех чисел 1-ой последовательности, которые не входят во вторую последовательность (считая, что хотя бы одно такое число есть).

Задание 2.

1. Сформировать двумерный массив А[4*6], элементы которого равны 5, если сумма их индексов четная, и 1, если сумма индексов нечетная.

2. Вычислить сумму положительных элементов в массиве В[5*4].

3. Проверить упорядочен ли массив С[4*4].

4. В массиве Х[3*4] поменять местами максимальный и минимальный элементы.

5. Упорядочить массив У[5*5] по возрастанию.

6. Дан массив А[10*10]. Сформировать новый массив В[10*10] заменив элементы больше 5 на 100 и элементы с суммой индексов кратными 4 на единицу.

7. В двумерном массиве А[6*4] вычислить произведение элементов больше 10.

8. Найти наибольший и наименьший элементы на главной диагонали двумерного массива MAS[5*5].

9. В двумерном массиве INMAS[7*7] найти суммы элементов в каждом столбце и сформировать из них одномерный массив RES[7].

10. Передвинуть все элементы в массиве А1[6*7] на один элемент влево, первый элемент при этом переместить на последнюю позицию.



Поделиться:


Последнее изменение этой страницы: 2020-11-28; просмотров: 142; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.17.150.163 (0.01 с.)