Тема 2 - Международный банковский институт

advertisement
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Тема 2
Практическая работа 5
Разработка пользовательских функций для
обработки массивов (2 часа)
Цель: научиться использовать базовые функции сортировки
массивов и писать дополнительные пользовательские функции,
которые позволяют применять нестандартные методы обработки
в ассоциативных массивах.
Необходимость сортировки данных, в том числе и данных, хранящихся в виде
массивов, очень часто возникает при решении самых разнообразных задач.
PHP
как наследник языка Perl имеет множество специальных встроенных функций
сортировки массивов.
Прежде всего это функция Sort (массив [, флаги])). Эта функция сортирует
массив, т. е. упорядочивает его значения по возрастанию. Эта функция удаляет все
существовавшие
в массиве
ключи,
заменяя
их числовыми
индексами,
соответствующими новому порядку элементов. В случае успешного завершения
работы она возвращает TRUE, иначе — FALSE.
Рассмотрим пример: заданы два массива: номера семестров — названия
дисциплин учебного плана и, наоборот, названия дисциплин учебного плана —
номера семестров, на которых они читаются. Упорядочим эти массивы
по возрастанию:
<?
$items = array(1 => "информатика", 3 => "сетевая экономика",
5 => "базы данных");
echo "Исходный массив <br>";
print_r($items);
echo "<br>";
sort($items);
echo "<br> строки сортируются в алфавитном порядке, ключи теряются
<br>";
print_r($items);
echo "<br>";
$rev_items = array("информатика" => 1,
"сетевая экономика" => 3, "базы данных" => 5);
echo "Исходный массив <br>";
print_r($rev_items);
echo "<br>";
sort($rev_items);
1
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
echo "<br> числа сортируются по возрастанию, ключи теряются <br>";
print_r($rev_items);
?>
Результаты работы данного скрипта приведены на рис. 1.
Рис. 1. Применение функции Sort()
В качестве дополнительного
из следующих констант:
аргумента
флага
может
использоваться
одна
SORT_REGULAR — сравнивать элементы массива обычным образом;
SORT_NUMERIC — сравнивать элементы массива как числа;
SORT_STRING — сравнивать элементы массива как строки.
Если требуется сохранять индексы элементов массива после сортировки, то нужно
использовать функцию asort (массив [, флаги]). Если необходимо отсортировать
массив в обратном порядке, т. е. от наибольшего значения к наименьшему,
то можно задействовать функцию rsort (массив [, флаги]). А если при этом нужно
еще и сохранить значения ключей, то следует использовать функцию arsort(массив
[, флаги]). Как вы, наверное, заметили, синтаксис у этих функций абсолютно
такой же, как у функции sort. Соответственно и значения флагов могут быть
такими же, как у sort: SORT_REGULAR, SORT_NUMERIC, SORT_STRING. Кстати
говоря, флаг SORT_NUMERIC появился только в PHP4.
Рассмотрим следующий пример, допустим, у нас есть массив, который содержит
список дисциплин, которые читаются студентам. Ключами массива являются
фамилии преподавателей, которые читают эти дисциплины.
Применим к сортировке данного массива обе рассмотренные выше функции.
2
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
<?php
$books = array("Богословская"=>"Информатика",
"Карпова"=>"Базы данных",
"Изранцев"=>"Сетевая экономика");
echo "Исходный массив <br>";
print_r($books);
echo "<br> Cортируем массив, сохраняя значения ключей < br >";
asort($books);
print_r($books);
echo "<br>";
echo " Cортируем массив в обратном порядке, ключи будут заменены < br
>";
rsort($books);
print_r($books);
?>
Результат работы данного скрипта приведен на рис. 2.
Рис. 2. Результат применения функций сортировки asort(),rsort()
Переменные функции
PHP поддерживает концепцию переменных функций. Это значит, что если имя
переменной заканчивается круглыми скобками, то PHP ищет функцию с таким же
именем и пытается ее выполнить.
<?
/* создадим две простые функции, одна сортирует массив в прямом порядке, а
другая в обратном
*/
$ a = array (1=>'Первое значение',2=>'Второе значение', 3=>'Третье значение');
3
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
function srt_a($a)
{
asort($a);
echo " < br > Cортируем массив, сохраняя значения ключей < br >";
print_r($a);
}
function srt_r($a)
{
echo " < br > Cортируем массив в обратном порядке, ключи будут заменены
<br>";
rsort($a);
print_r($a);
}
$func = "srt_a";
//создаем переменную со значением,
// равным srt _ a
$func($a);
// это вызовет запуск функции str _ a с аргументом $a
$func = "srt_r";
// создаем переменную со значением,
// равным str _ r
$func($a);
// это вызовет запуск функции str _ r с аргументом $a
//
?>
Результаты работы функции представлены на рис. 3.
4
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Рис. 3. Использование переменных-функций
Иногда возникает необходимость в сортировке массива по значениям ключей. Для
этого в PHP можно воспользоваться функцией ksort() для сортировки
по возрастанию (прямой порядок сортировки) или krsort() — для сортировки
по убыванию (обратный порядок сортировки). Синтаксис этих функций опять же
аналогичен синтаксису функции sort().
Задание 1
Создать библиотеку пользовательских функций по обработке массива, которая
включает 6 рассмотренных функций: sort(),asort(),rsort(),arsort(), ksort (), krsort ().
Каждая функция должна формировать соответствующее сообщение о порядке
и типе сортировки, выполнять эту сортировку применительно к заданному массиву,
аналогично рассмотренному ранее примеру. Все функции сохранить в файле
arr_lib.inc.
В отдельных файлах с именами ar 1. inc и ar 2. inc создать два массива, один
из них содержит список не менее чем из 5 книг, ключами служат авторы, второй
содержит список не менее чем из 5 товаров, ключами служат цены товаров.
Написать скрипт, который бы применял требуемую обработку к заданному
массиву. Библиотеку и исходные массивы пригружать к скрипту, используя
команду INCLUDE. При вызове библиотечной функции использовать технологию
переменных-функций. Имя переменной функции и имя массива передавать как
параметры вызова скрипта.
Сортировка с помощью функции, заданной пользователем
Кроме двух простых способов сортировки значений массива (по убыванию или
по возрастанию), PHP предлагает пользователю возможность самому задавать
критерии для сортировки данных. Критерий задается с помощью функции, имя
которой указывается в качестве аргумента для специальных функций сортировки
usort() или uksort(). По названиям этих функций можно догадаться, что usort()
сортирует значения элементов массива, а uksort() — значения ключей массива
5
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
с помощью определенной пользователем функции. Обе функции возвращают TRUE,
если сортировка прошла успешно, и FALSE — в противном случае. Их синтаксис
выглядит следующим образом:
 usort (массив, сортирующая функция);
 uksort (массив, сортирующая функция).
Конечно же, нельзя сортировать массив с помощью любой пользовательской
функции. Эта функция должна удовлетворять определенным критериям,
позволяющим сравнивать элементы массива. Как должна быть устроена
сортирующая функция? Во-первых, она должна иметь два аргумента. В них
интерпретатор будет передавать пары значений элементов для функции usort() или
ключей массива для функции uksort(). Во-вторых, сортирующая функция должна
возвращать:
 целое число, меньшее нуля, если первый аргумент меньше второго;
 число, равное нулю, если два аргумента равны;
 число большее нуля, если первый аргумент больше второго.
Как и для других функций сортировки, для функции usort() существует аналог,
не изменяющий значения ключей, — функция uasort().
Рассмотрим пример:
Допустим, у нас есть массив, содержащий такие сведения о учебных
дисциплинах, как название, автор и номер семестра. Мы хотим упорядочить книги
по номеру семестра.
<?php
// массив выглядит таким образом:
$dis = array("Сетевая экономика" =>
array ("Изранцев В.В.",3),
"Сети" => array("Гришин П.В.",4),
"Информационные
("Соколов",6),
системы"
=>
"Базы данных" => array("Карпова Т.С.",5));
/* можно, конечно, переписать этот массив
по-другому, сделав семестр, например,
индексом, но гораздо удобнее написать свою
функцию для сортировки */
uasort($ di s,"cmp");
// сортируем массив с помощью функции cmp
foreach ($dis as $key => $d) {
echo "$ d [0]: \"$key\"<br>";
}
function cmp($a,$b){
6
array
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
// функция, определяющая способ сортировки
if ($a[1] < $b[1]) return -1;
elseif ($a[1]==$b[1]) return 0;
else return 1;
}
?>
Результат работы нашего скрипта приведен на рис. 4.
Рис. 4. Сортировка массива с использованием пользовательских функций
Задание 2
Добавить в массив учебных дисциплин, за номером семестра еще количество
учебных часов в семестре. Написать пользовательскую функцию, которая бы
сортировала по количеству часов в семестре.
Провести
сортировку
массива
учебных
дисциплин
с использованием
разработанной функции сначала в прямом, а затем в обратном порядке.
Кроме пользовательских функций сортировки массивов, в PHP можно разработать
специальную
пользовательскую
функцию,
которая
будет
обрабатывать
поэлементно массив. Для того чтобы применить эту пользовательскую функцию,
в PHP есть специальная внутренняя функция: array_walk(массив, функция
[, данные]). Эта конструкция применяет созданную пользователем функцию
ко всем элементам массива, возвращает TRUE в случае успешного выполнения
операции и FALSE — в противном случае.
Пользовательская функция, как правило, имеет два аргумента, в которые
поочередно передаются значение и ключ каждого элемента массива. Но если при
вызове функции array_walk() указан третий аргумент, то он будет рассмотрен как
значение третьего аргумента пользовательской функции, смысл которого
определяет сам пользователь. Если функция пользователя требует больше
аргументов, чем в нее передано, то при каждом вызове array_walk() будет
выдаваться предупреждение.
7
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Если необходимо работать с реальными значениями массива, а не с их копиями,
следует передавать аргумент в функцию по ссылке. Однако нужно иметь в виду,
что нельзя добавлять или удалять элементы массива и производить действия,
изменяющие сам массив, поскольку в этом случае результат работы array_walk()
считается неопределенным.
Рассмотрим пример. Пусть задан массив
<?
// исходный массив
$groops = array ("163"=>"1", "135"=>"8", "145"=>"6", "153"=>"4");
// дополнительные пользовательские функции
function test_alter (&$item1, $key, $prefix) {
$item1 = "$prefix: $item1";
}
function test_print ($item2, $key) {
echo "$key. $item2<br>\n";
}
// применение функции test_print
array_walk ($groops, 'test_print');
// установка указателя массива в исходное состояние
reset ($fruits);
// применение функции test_alter
array_walk ($groops, 'test_alter', ' семестр ');
echo " Содержимое массива после обработки функцией test_alter- < br
>";
// установка указателя массива в исходное состояние
reset ($groops);
// применение функции test_print
array_walk ($groops, 'test_print');
?>
Результаты работы скрипта приведены на рис. 5.
8
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Рис. 5. Применение пользовательских функций
Задание 3
Задан список преподавателей в виде ассоциативного массива. Ключом является
ФИО преподавателя, значением — название кафедры, на которой данный
преподаватель работает. Например:
$a=array(‘Бритов'=>'Прикладной
‘Кузютин'=>'Математики')
информатики',
Написать скрипт, который выводит список преподавателей в следующем виде:
Бриттов
Г.С.
информатики
–
кафедра
прикладной
Кузютин Д.В. – кафедра 'Математики')
Применить функцию test _ alter и array _ walk
Работа с подмассивами
Поскольку массив — это набор элементов, вполне вероятно, потребуется
выделить из него какой-нибудь поднабор. В PHP для этих целей есть функция
array_slice. Ее синтаксис таков:
array_slice
длина])
(массив,
номер_элемента
[,
Эта функция выделяет подмассив длины длина в массиве массив, начиная
с элемента, номер которого задан параметром номер_элемента. Положительный
номер_элемента указывает на порядковый номер элемента относительно начала
массива, отрицательный — на номер элемента с конца массива.
9
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
<?php
$arr = array(1,2,3,4,5);
$sub_arr = array_slice($arr,2);
print_r($sub_arr);
/* выведет Array ([0] => 3 [1] =>4 [2] => 5),
т.е. подмассив, состоящий из элементов 3, 4, 5
*/
$sub_arr = array_slice($arr,-2);
print_r($sub_arr);
// выведет Array ([0] => 4 [1] => 5),
// т.е. подмассив, из элементов 4, 5
?>
Есть еще одна функция, похожая на array_slice() — это array_chunk(). Она
разбивает массив на несколько подмассивов заданной длины. Синтаксис ее такой:
array_chunk
(массив,
сохранять_ключи])
размер
[,
В результате работы array_chunk() возвращает многомерный массив, элементы
которого представляют собой полученные подмассивы. Если задать параметр
сохранять ключи как TRUE, то при разбиении будут сохранены ключи исходного
массива. В противном случае ключи элементов заменяются числовыми индексами,
которые начинаются с нуля.
Задание 4
Задан список студентов в виде массива. Для деловой игры требуется разбить этот
список на команды по 3 человека. Сохранить список команд в виде ассоциативного
массива. Номер команды — ключ, состав команды — подмассив.
При формировании массива использовать функцию перемешивания
<?
$numbers=array('Иванов','Петров','Сидоров','Крылов'
);
srand ((float)microtime()*1000000);
shuffle ($numbers);
while (list (, $number) = each ($numbers)) {
echo "$number ";
}
?>
Функция shuffle () осуществляет перестановку элементов массива. Для запуска
этой
функции
требуется
установить
некоторый
рандомизатор
srand()
с параметрами.
10
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Пример выполнения указанного ранее скрипта приведен на рис. 5.
Рис. 5. Случайная перестановка элементов массива
Задание 6 для самостоятельной работы
Расширим предыдущую задачу. Будем считать, что каждый из игроков набирает
некоторое количество баллов. Командные баллы высчитываются как сумма баллов
его игроков. Сосчитать баллы, полученные каждой командой, и распределить
команды по местам. Вывести результирующий список команд с указанием
набранных баллов и завоеванного места.
Внимание! Все выполненные задания предъявить
получить зачет по данному практическому занятию.
преподавателю,
Сохранить все созданные скрипты в своей папке на своем сетевом ресурсе,
потому что файлы, оставленные на локальном диске, могут быть случайно или
специально уничтожены вашими коллегами — студентами других групп.
Если вы не успели выполнить все задания, вы можете сделать
предъявить преподавателю на следующем занятии и получить зачет.
11
их дома,
Download