Тема 2 Практическое занятие 3 Изучение принципов работы с ассоциативными массивами (4 часа)

advertisement
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Тема 2
Практическое занятие 3
Изучение принципов работы с
ассоциативными массивами (4 часа)
Цель: освоение методов работы с ассоциативными массивами
средствами языка PHP.
Массивы являются базовой структурой хранения данных в языке PHP, однако
интерпретация понятия массива на PHP несколько отличается от традиционных
языков программирования, поэтому работа с массивами на PHP требует серьезного
и тщательного изучения.
Массив на PHP — это нерегулярная структура, т. е. в отличие от других языков
программирования массив может иметь нерегулярную размерность и его члены
могут иметь различные типы данных и даже быть массивами.
Массив может быть создан несколькими способами. Простейшим способом
задания массива является процедура явного присваивания:
$a[]=12
5;
В этом операторе мы текущему элементу массива с именем $ a присвоили
значение числовой целочисленной переменной 125. В отличие от переменных
идентификатор массива сопровождается двумя квадратными скобками, что
и позволяет отличить его от переменной $ a. Однако нельзя называть одинаково
массив и переменную в одном программном модуле, т. е. если вы напишите
последовательно 2 оператора:
$a=45;
$a[]=17
7;
то получите следующее предупреждение об ошибке:
Warning : Cannot use a scalar value as an
array
При исправлении предыдущего фрагмента на следующий:
$a=45;
$b[]=17
7;
транслятор не обнаружит противоречия.
Оператор присваивания каждый раз перемещает указатель текущего элемента
массива на следующее место, и поэтому при повторном выполнении операции
присвоения новое значение будет уже присвоено следующему элементу массива:
1
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
$b[]=177
;
$
[]=322;
b
Если мы явно не указываем индекс элемента в массиве, то присвоение индексов
начинается
с нуля
и для
каждого
следующего
элемента
увеличивается
на 1. В нашем случае мы получили значение с нулевым индексом, равным 177,
а с единичным — равным 322. Мы можем явно обращаться к элементам массива,
используя индексы:
$b[1]=$b[1]
100;
-
Иногда удобно присваивать значения элементам массива в цикле:
For ($ i =0;$ i <20;$ i ++) $ a []=$ i
*3+1;
Для вывода элементов массива можно использовать стандартные операторы
вывода Echo и Print, но они пригодны только для поэлементного вывода,
т. е. корректны будут операции:
Echo $ a [6]; Print $ a
[11];
Однако вывести весь массив этими операторами нельзя. Для вывода всего
массива с указанием значений ключей используется функция:
Print _ r ($ a); // здесь $ a — это идентификатор массива.
Результат работы данной функции для предыдущего примера приведен на рис. 1.
Рис. 1. Вывод массива с использованием функции Print _ r
Здесь в квадратных скобках представлен индекс каждого элемента, далее идет
указатель ссылка => на значение элемента.
2
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Можно выполнять операцию присваивания с явным указанием индекса элемента:
$a[20]=11
1;
Изменить значение элемента массива очень просто, для этого надо просто
выполнить оператор присваивания для данного элемента. Для точного указания
элемента нам требуется задать его ключ (или индекс). Например, изменить
значение элемента массива $ a с индексом 20 можно следующим оператором:
$
[20]=345;
a
Изменить ключ элемента массива нельзя. Можно удалить элемент массива
с использованием функции unset () и потом заново присвоить старое значение
элементу с новым ключом.
Unset ($ a [20]); // удаляет элемент с индексом
20.
Unset ($ a); // удаляет массив $ a целиком.
Если для элемента массива ключ не задан, то в качестве ключа берется
максимальный числовой ключ, увеличенный на единицу. Если указать ключ,
которому уже было присвоено какое-то значение, то оно будет перезаписано.
Начиная с PHP 4.3.0, если максимальный ключ — отрицательное число,
то следующим ключом массива будет ноль (0).
Заметим, что когда используются пустые квадратные скобки, максимальный
числовой ключ ищется среди ключей, существующих в массиве с момента
последнего переиндексирования. Переиндексировать массив можно с помощью
функции array_values (). При использовании переиндексации происходит
выстраивание числовых индексов заново по порядку, начиная с 0 (нуля).
Задание 1
Создать линейный массив из 20 целых чисел, значения которых вычисляются
по формуле $ a []=$ i *3+ N, здесь N — это номер студента по журналу; $ i —
индекс элемента массива. Вывести полученный массив на печать с использованием
функции print _ r;
Задание 2
Создать линейный массив из 30 целых чисел с индексами, соответствующими
четным числам, начиная с 2. Значения элементов массива вычисляются по формуле
$ a [$ i ]=$ i /2 + N; здесь N — это номер студента по журналу; $ i — индекс
элемента массива. Вывести массив в виде таблицы (см. рис. 2). При выводе
в ячейки таблицы используйте выравнивание содержимого по центру ячейки.
Таблицу сделать с границей. Вывод проводить в цикле поэлементно. Помнить, что
в операторах вывода Echo и Print нельзя использовать внутри строки вывода
арифметические операции. Все вычисления и присваивания надо сделать
до начала цикла.
3
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Рис. 2. Внешний вид результата по заданию 2
Тег создания таблицы может быть вынесен за текст PHP-скрипта, как и тег
завершения, потому что это чисто HTML-операторы.
Не забудьте: при использовании циклов применить фигурные скобки,
т. к. во втором задании у вас будет несколько операторов составлять тело цикла.
При пропуске каких-либо числовых индексов, присваивание следующего индекса
идет по правилу: значение максимального индекса + 1.
Кроме числовых индексов в массивах могут быть использованы и строковые
индексы. Операторы присваивания при этом позволяют присвоить значение
любому элементу массива с явным указанием индекса, например:
$s[“
1546;
начальный
”]
=
Считается, что все индексы в массиве должны быть различными, потому что
обращение к элементу массива идет по индексу. Однако если вы создадите
следующий массив:
$a=array('a'=>1,'b'=>2,'a'=>3
);
то транслятор не посчитает это ошибкой, но при применении функции вывода
на печать массива Print _ r ($ a) мы получим:
Array ([a] => 3 [b] =>
2)
А если выведем Echo $ a [‘ a ’], то снова получим 3, т.е. при наличии элементов
с одинаковыми
индексами
автоматически
остается
в массиве
элемент
с максимальным индексом.
4
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Следующим способом задания массива является использование конструкции
Array, например:
$
a
=
(1=>100;2=>200;6=>400);
array
 здесь мы создали линейный массив, содержащий 3 элемента с индексами
1, 2 и 6 соответственно. Если теперь мы выполним операцию присваивания
$
[]=555;
a
то у элемента со значением 555 индекс будет равен 7.
Обход элементов массива можно делать с использованием специальных функций
перемещения по указателю (курсору). Это следующие функции (см. табл. 1):
Таблица 1. Функции по работе с массивами с использованием курсора
Функция
Назначение
count ($ arr 1)
Число элементов на внешнем уровне массива
Next ($ arr 1)
Установка указателя на следующий элемент массива
prev($arr1)
Установка указателя на предыдущий элемент массива
current($arr1)
Установка указателя на текущий элемент массива
reset ($ arr)
Сброс указателя массива в исходное состояние
End ($ arr)
Установка указателя на последний элемент массива
Key ()
Получение значение ключа текущего элемента массива
Задание 3
Создать
с
использованием
оператора
Array
массив,
соответствующий
расшифровке цветов радуги с помощью ключевой фразы «Каждый охотник желает
знать, где сидит фазан». Значениями должны стать слова фразы, ключами должны
стать соответствующие цвета.
Обойти массив с использованием функций управления курсором сначала в одну
сторону, а потом наоборот, распечатать массив при обходе в виде таблицы,
аналогично заданию 2. Вывести значение и ключ текущего элемента массива сразу
после создания массива.
Использовать цикл While. При перемещении по массиву функция next () будет
отличаться от нуля (будет истинна), пока вы находитесь внутри массива. При
перемещении в обратную сторону функция prev () также будет отличной от нуля,
пока вы не выходите за границы массива.
Распечатать ключевую фразу в одну строку.
При работе с массивами часто возникает необходимость добавить или удалить
элементы массива либо с конца, либо сначала. Конечно, добавить элемент массива
5
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
в конец можно, пройдя весь его целиком, но для подобных действий в PHP
существуют дополнительные функции, которые приведены в табл. 2.
Таблица 2. Функции добавления и удаления элементов массива
Array _ pop () –
Array_push($arr,
$var,$var1…)
Получение и удаление последних элементов
массива
Добавление элементов в конец массива
Array_shift($arr,$v1,$v2…)
Получение
и удаление
первых
элементов
массива. Возвращает первый элемент массива
и удаляет
его,
сдвигая
все
последующие
элементы на одну позицию вперед
Array_unshift($arr)
Добавление
элементов
в начало
массива.
Добавляет все перечисленные элементы в начало
массива, при этом все последующие сдвигаются
в конец, возвращает новое число элементов
массива
Рассмотрим более подробно работу данных функций. Например:
$ a = array (1,2,3,4); // исходный массив $ a из 4 чисел.
$ b = array _ pop ($ a ); // в $ a останется все, кроме последнего
элемента, т. е. 1,2,3.
// в $ b попадет последний элемент массива $ a ;
Если $ a является сложным массивом, в котором последний элемент так же
является массивом, то функция array _ pop ($ a) удалит этот массив и присвоит
его переменной, стоящей слева от знака присваивания. Например, результат
работы следующего фрагмента:
$c=array(1,2,3,4,array(5,6,7)
);
print_r ($c);
$s=array_pop($c);
echo "<br> после <br>";
print_r ($c);
echo " <br> остаток <br>";
if (is_array($s)) print_r ($s);
else echo " <br> не массив
$s";
представлен на рис. 3.
6
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Рис. 3. Применение функции array _ pop к сложному массиву
Рассмотрим работу функции Array _ push ($ arr, $ var,$ var 1...). Эта функция
добавляет элементы, перечисленные после имени массива, который идет первым
параметром, в конец массива. При этом элементы могут быть как простыми
переменными, так и массивами. Рассмотрим пример.
$c=array(1,2,3,4,array(5,6,7));
echo " Исходный массив <br>";
print_r ($c);
$v1="первый";
$v2= 10;
echo "<br> Добавляемы элементы <br> $v1 <br> $v2
<br>";
Array_push($c, $v1,$v2);
echo " Результирующий массив <br>";
print_r ($c);
$v3=array(11,12,13);
$v4=" новости ";
$v5=array("валюта","политика","новые технологии");
echo "<br> Добавляемые элементы <br>";
print_r ($v3);
echo "<br> $v4 <br>";
print_r ($v5);
Array_push($c, $v3,$v4,$v5);
echo " <br> Результирующий массив <br>";
print_r ($c);
7
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Результат работы данного скрипта приведен на рис. 4.
Рис. 4. Добавление элементов в массив с использованием функции Array _ push
Функции array _ shift и array _ unshift работают аналогично, только удаляют
и добавляют элементы в начало массива.
Для обхода массива, кроме уже перечисленных циклов, удобно использовать
специальный цикл FOREACH ()
Существуют две разновидности команды FOREACH, предназначенные для разных
типов массивов: линейных и ассоциативных массивов. Для линейных применим
следующий синтаксис
foreach (массив as $элемент)
{
блок }
Для ассоциативных массивов применим иной синтаксис:
foreach (массив as $ключ => $элемент)
{
блок }
Например, для вывода линейного ассоциативного массива можно написать
следующий фрагмент кода:
8
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
$s = array(array ("Попов А.А." =>4,"Архипова Т.С." => 5,"Быков П.А." =>
4);
foreach ($s as $i => $mark) {
print " Студент $ i получил оценку $ mark < BR >";
}
Результаты работы скрипта представлены на рис. 5.
Рис. 5. Использование цикла Foreach
Кроме перечисленных конструкций существуют еще 3 часто используемые
функции по работе с массивами. Описание этих функций приведено в табл. 4.
Таблица 4. Функции преобразования массива в наборы переменных и обратно
Функция
Назначение
List($var1,$var2…)
Занесение элементов массива в переменные
Compact($var1,$var2…)
Each ($ array)
Занесение набора переменных в массив. Создает
массив из указанных переменных, их имена являются
ключами, а значения — значениями в ассоциативном
массиве
Получение текущего элемента массива.
Возвращает в массиве пару индекс-значение и сдвигает
курсор на одну позицию вперед
Функция List () присваивает переменным, которые
ее параметров, значение элементов массива. Например:
$a=array(1,"Петров",1989);
list($v1,$v2,$v3)=$a;
echo "Номер".$v1."<br> ФИО ".$v2." <br> год рождения
9
заданы
в качестве
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
".$v3;
Результат работы скрипта представлен на рис. 6.
Рис. 6. Результат преобразования массива в набор переменных
Функция List работает не только с простыми линейными массивами, она просто
производит декомпозицию массива, присваивая именам, используемым в качестве
ее аргументов, значения соответствующих по порядку элементов массива.
Рассмотрим пример сложного массива:
$a=array(1,array("
",1989));
Петров
","
м
list($v1,$v2)=$a;
echo " номер ".$v1." <br>";
//
print_r ($v2);
Результат работы данного скрипта приведен на рис. 7.
10
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Рис. 7. Декомпозиция сложного массива
Функция Compact ($ var 1,$ var 2...) осуществляет обратную задачу, она создает
из элементов, которые являются ее аргументами, массив. При этом ассоциативными
ключами в этом массиве являются имена переменных. Имена переменных задаются
как символьные константы в двойных кавычках без знака $. Рассмотрим пример:
$v1="математика";
$v2="информатика";
$v3="экономика";
$s=Compact("v1","v2","v3");
foreach($s as $k => $v)
{
echo "ключ $ k значение $ v < br
>";
}
Результат работы этого фрагмента приведен на рис. 8.
11
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Рис. 8. Работа функции Compact /
Так же, как и функция List, эта функция применима не только к простым
элементам. В качестве составных частей будущего массива могут быть массивы
любого уровня вложенности. Например, если мы изменим предыдущий скрипт
следующим образом:
$v1="математика";
$v2="информатика";
$v3=
array
"экономика",64);
(3,
$s=Compact("v1","v2","v3");
Print _ r ($ s);
то получим следующий результат (см. рис. 9):
Рис. 9. Компоновка массива из сложных элементов
Последняя из приведенных в табл. 4 функций Each () позволяет получить
значение текущего элемента массива. В отличие от уже известной нам функции
Current () — функция Each одновременно перемещает курсор на следующую
позицию, а функция Current этого не делает. Поэтому функция each используется
для обхода массива.
12
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Возвращаемый массив имеет 4 значения:
[0] индекс
[1] значение
[2] ключ
[3] значение
Например:
$ frends = array ("Илья", "Марина", "Андрей", "Миша", "Павел",
"Лариса");
$bar = each ($frends);
print_r($bar);
Результат работы данного фрагмента приведен на рис. 10.
Рис. 10. Получение первого элемента массива с использованием функции each ()
Когда курсор достигает конца массива, функция each () возвращает False.
Поэтому чаще всего эта функция используется совместно с функцией List для
обхода массива. Далее приведен фрагмент кода, содержащего данный вид обхода:
<table> <?
$ frends = array ("Илья"=> 9213456754, "Марина"=> 911776544254, "Андрей"=>
905777754332, "Миша"=> 9213666775542, "Павел"=> 91198766543, "Лариса"=>
9987654);
while (list($key,$value) = each($frends))
{ echo "<tr><td>$key </td> <td> телефон </td><td> $value </td></tr>";
}
Результат приведен на рис. 11.
13
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Рис. 11. Обход массива с использованием функций list и each
Задание 4
Напишите PHP-скрипт, в котором создается одномерный массив, содержащий
6 элементов со следующими ключами (см. табл. 5):
Таблица 5. Исходные данные
Ключ
Значение
Se
Швеция
Ch
Швейцария
Cz
Чехия
At
Австрия
Tw
Тайвань
Sg
Сингапур
Далее с массивом произведите следующие действия:
 выведите содержимое массива на экран в виде таблицы без рамки;
 добавьте новый элемент в созданный массив: ключ jp, значение Япония,
в конец массива, используя функцию array _ push;
на экран содержимое полученного массива в виде таблицы
с границей, используя цикл FOREACH;
выводить ключ и значение каждого элемента;
удалите элемент массива Япония, используя соответствующую функцию;
выведите на экран содержимое массива в виде таблицы с границей
c использованием функций List и each;
добавьте в начало массива элемент ключ tv — значение остров Тувалу;
 выведите




14
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
 выведите
на экран содержимое массива в виде таблицы
используя любой из рассмотренных методов обхода массива.
с границей,
Задание 5
Создайте ассоциативный массив из 5 элементов, ключами в массиве являются
фамилии людей, значениями — номера их телефонов. Напишите скрипт, который
по фамилии, переданной в качестве параметра, выводит на экран номер телефона
данного человека.
При передаче мы пользуемся методом GET, т. е. передаем параметры через
строку вывода, отделяя их знаком вопроса ? от имени скрипта.
Над массивами можно производить действия. Оператор сложения применим
и к массивам. Например:
$a=array(1=>"один",2=>"два");
$b=array(3=>"три",4=>"четыре");
$c=$a+$b; // массив $ b запишется в конец $ a
Print_r($c);
Echo " <br>";
b
$ d =$ b +$ a; // массив $ a запишется в конец $
Print_r($d);
Результат работы скрипта приведен на рис. 12.
Рис. 12. Сложение массивов
Для выполнения операции вычитания и пересечения массивов используются
специальные функции: array_diff и array_intersect.
Далее приведен пример скрипта, использующего обе эти функции.
$array1 = array ("a" => "green", "red", "blue",
"red");
15
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
$array2 = array ("b" => "green", "yellow", "red");
$result = array_diff ($array1, $array2);
print_r($result); echo "<br>";
$r=array_diff ($array2, $array1);
print_r($r); echo " <br> Пересечение <br>”;
$r2 = array_intersect ($array1, $array2);
print_r($r2);
Результат работы данного скрипта изображен на рис. 13.
Рис. 13. Работа с функциями разности и пересечения для массивов
При обращении к многоуровневым элементам массива индексы задаются слеванаправо и записываются в отдельных квадратных скобках.
Например, если мы построим массив, имитирующий сдачу экзаменов студентами,
то подобный массив можно задать следующим образом:
$
sessia
=
Array
(“математика”=>5,”информатика”=>4),
(“Петров”=>
array
“Сидоров”=> array (“математика”=>5,”информатика”=>5));
Для того чтобы вывести оценку, которую получил студент "Сидоров" по предмету
«Информатика» нам необходимо написать следующее обращение:
Echo $sessia[“ Сидоров ”][“ информатика
”];
16
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Если нам необходимо узнать, сколько предметов сдал студент Сидоров, то надо
сосчитать, сколько элементов массива второго уровня у элемента с ключом
Сидоров существует:
$ c = count ($ sessia [“Сидоров”]);
Echo “Сидоров сдал $ c экзаменов < br
>”;
Как надо обходить сложный нелинейный массив? Массив $ sessia необходимо
обходить с использованием 2 вложенных циклов. Внешний цикл позволит вам
перемещаться по студентам, а внутренний по сданным экзаменам для каждого
студента.
Например, вывод содержимого массива $ sessia можно выполнить следующим
образом:
Foreach($sessia as $fio=>$exam)
{ echo “Студент $ fio сдал экзамены < br >”;
Foreach($exam as $dis=>$mark) echo “ $dis на $mark
<br>”;
}
На рис. 14 представлен результат работы данного фрагмента кода.
Рис. 14. Вывод нелинейного массива
Задание 6
Создать массив $ sessia, заполнив его данными для 5 студентов. Количество
сданных экзаменов должно колебаться от 1 до 5. Напишите скрипт, который
позволяет получить по фамилии студента количество сданных им экзаменов
17
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
и их список с оценками. Фамилию студента передавать в скрипт как параметр
через протокол GET.
Задание 7
Расширить обработку в задании 6. В качестве параметров у вас могут
передаваться либо фамилия студента, либо название дисциплины. Для первого
случая обработка остается такая же, как в задании 6. При передаче в качестве
параметра названия дисциплины требуется вывести список всех студентов,
которые сдали данную дисциплину с указанием оценки, которую студент получил
на экзамене.
Для обработки массивов существует еще ряд дополнительных функций. Так,
например, функция array_flip($a) выполняет одновременно два действия: меняет
ключи и значения, т. е. значения становятся ключами, а ключи значениями
в массиве и одновременно удаляются дубликаты значений (в первоначальном
массиве), т. е. ключей в результирующем массиве. И это понятно, потому что
не может быть одинаковых ключей в ассоциативном массиве.
Рассмотрим работу следующего фрагмента кода:
<?php
$a[0] = "Математика";
$a[1] = "Математика";
$a[2] = "Информатика";
$a[3] = "Информатика";
$a[4] = "Экономика";
echo " Исходный массив <br>";
print_r($a);
echo "
<br>";
Первое
преобразование
$trans = array_flip($a);
print_r ($trans);
$a = array_flip($trans);
echo
<br>";
"
Второе
преобразование
print_r ($a);
?>
Результат работы данного скрипта приведен на рис. 15.
18
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Рис. 15. Применение функции array _ flip
Фактически двойное применение функции позволило избавиться от дубликатов
значений. Однако для избавления от дубликатов служит специальная функция
Array _ unique (). Приведем скрипт для того же исходного массива, который решает
задачу удаления дубликатов.
<?
$a[0] = "Математика";
$a[1] = "Математика";
$a[2] = "Информатика";
$a[3] = "Информатика";
$a[4] = "Экономика";
echo " Исходный массив <br>";
print_r($a);
echo "<br>
<br>";
Первое
преобразование
$trans = array_unique($a);
print_r($trans);
?>
Результат выполнения скрипта приведен на рис. 16. Если мы сравним результаты,
то увидим, что в первом случае в конечном массиве значение «Математика» имеет
индекс 1, а во втором 0 (ноль), и то же самое по отношению к элементу
со значением «Информатика».
19
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Рис. 16. Результат работы функции array _ unique ()
Значит, функция array _ unique () оставляет элемент с минимальным индексом.
А при использовании двойного преобразования с использованием функции array
_ flip () остается из дубликатов элемент с максимальным значением индекса.
Задание 8
Для каждой группы задан перечень экзаменов, вынесенных на сессию. Список
задан в виде массива, ключом которого является номер группы, а значением —
массив предметов, вынесенных для данной группы на сессию.
Получить список предметов, вынесенных на сессию для всех групп без
повторений. В исходных данных задать не менее 3 групп и не менее 3 экзаменов
для каждой группы.
Еще одна важная функция — это функция поиска в массиве array _ search ($ b,$
s), здесь $ b — искомый элемент, $ s — массив, в котором проводится поиск. При
этом результатом является истина, если найден искомый фрагмент среди значений
исходного массива, и ложь, в противном случае. Рассмотрим пример с линейным
массивом:
<?
$a=array('php','c#','sql','.net');
$b='sql';
If (array_search ($b,$a)) echo " Есть
$b";
else echo "Нет $b ";
?>
20
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Результат работы данного скрипта приведен на рис. 17.
Рис. 17. Применение функции array _ search ($ b,$ a) к линейному массиву
Однако функцию array _ search ($ b,$ a) можно применять и в том случае, если
искомым элементом является также массив. Например, допустим, что у нас есть
массив, в котором находятся результаты сессии. Ключами являются фамилии
студентов, значениями являются массивы из пар предмет-оценка. Зададимся
вопросом, сдал ли кто-либо заданные предметы на заданные оценки. Далее
приведен скрипт, который решает подобную задачу:
<?
$s=
array('Иванов'=>
(‘Математика'=>5,'Информатика'=>4),
array
'Петров'=>array('Информатика'=>4,'Экономика'=>4));
$b=array('Математика'=>5,'Информатика'=>4);
$c=array_search ($b,$s);
If (array_search ($b,$s)) echo " Найдено $c ";
else echo " Не найдено ";
?>
Результат работы скрипта приведен на рис. 18.
Рис. 18. Применение поиска в заданном массиве
При этом результатом поиска является либо ложь, либо ассоциативный ключ
элемента, значение которого соответствует искомому массиву.
21
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Следует отметить, что поиск происходит только среди значений элементов
первого уровня массива, которыми могут быть как простые значения, так
и массивы. Для вложенных массивов поиск с использованием данной функции
проводить нельзя. Например, задав в качестве поискового значения оценку
5, мы получим отрицательный результат. Для того чтобы найти конкретную оценку,
необходимо применить функцию поиска уже для значений элементов массива
первого уровня. А как определить, сдавал ли конкретный предмет конкретный
студент? Мы напрямую не можем применить функцию поиска, потому что предмет
у нас является ассоциативным ключом, но в этом случае нам поможет уже
известная нам функция array _ flip (), которая позволяет преобразовать ключи
в значения для линейного массива.
Задание 9
Задан массив «Сессия» для 4 студентов, каждый из которых сдавал не менее
3 экзаменов. Написать скрипт, который позволяет выполнить следующие действия:
 по заданной фамилии получить перечень дисциплин с указанием оценки,
полученной на сессии;
 по заданному названию дисциплины
которые сдавали данный предмет.
получить
список
всех
студентов,
Параметры передавать в скрипт по протоколу GET, используя адресную строку.
Для различения ситуаций использовать функцию isset ($ f), которая позволяет
определить, была ли задана переменная $ f.
Задание 10 (для самостоятельной работы)
Задано расписание занятий на текущую неделю для конкретной аудитории.
Считаем, что в качестве аудитории выбрана аудитория на одну группу, поэтому
на каждой паре в ней могут проходить занятия только для конкретной группы.
Допустим, это расписание может быть представлено в виде сложного массива,
например:
$r=array('понедельник'=>array(
1=>array('Группа'=>145,'Предмет'=>'Программирование','Преподаватель'=>
'Богословская Н.В.'),
2=>array('Группа'=>145, 'Предмет'=>'ИС', 'Преподаватель'=>'Соколов Н.Е.'),
3=>array('Группа'=>141, 'Предмет'=>'Банковское дело',
'Белоглазова Г.Н.')),
'Преподаватель'=>
'вторник'=>array(
1=>array('Группа'=>145, 'Предмет'=>'ВС', 'Преподаватель'=>'Гришин П.В.'),
2=>array('Группа'=>141, 'Предмет'=>'Бухучет', 'Преподаватель'=>'Бусуек
Н.А.')
));
Здесь
задано
расписание
на 2 дня:
понедельник
и вторник,
в понедельник заняты 3 пары в данной аудитории, а во вторник только 2.
22
причем
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Для того чтобы получить ответ, кто ведет занятия во вторник на второй паре,
необходимо обратиться к элементу массива следующим образом:
']
$r[‘ вторник '][2][‘ преподаватель
Расширить расписание, заполнив его на 3 пары среды.
Написать скрипт, который позволяет ответить на следующие вопросы:
 вывести расписание для конкретной группы (на все дни недели с указанием
предмета и преподавателя);
 вывести расписание для конкретного преподавателя, так же на все дни
недели с указанием группы и предмета.
Группу или фамилию преподавателя задавать как параметры при вызове скрипта.
23
Download