Поиск
Сортировка массивов
В РНР поддерживается несколько способов сортировки массивов (под сорти ровкой мы имеем в виду распределение по алфавиту для строк и разброс в ариф метическом порядке для чисел). При сортировке массива необходимо иметь в виду, что он состоит из многих пар ключей и значений. Поэтому можно сор тировать массив на основе значений либо ключей. Допустимо также распреде лить значения и оставить им имеющиеся ключи или присвоить новые.
Сортировка толькр по значениям элементов без учета ключей выполняется с помощью функции sort ( ) . В обратном порядке и снова без учета ключей зна чения распределяют с помощью функции rsort ( ) . Синтаксис функций выгля дит следующим образом:
sort($Array);
rsort($Array);
После вызова функций изменится порядок элементов в массиве $Аггау. По сути, из тех же элементов создается другой массив. Если массив был проиндек сирован по умолчанию, числами начиная с нуля и заканчивая величиной count ($Array) 1, то о новых значениях ключей можно*не заботиться. Однако, если мы проиндексировали массив строками или числами в особом порядке, то желательно не потерять связь между ключами и соответствующими значе ниями. Для таких массивов имеется специальный термин ассоциативные мас сивы, или хэши. Оказывается, в языке РНР все массивы ассоциативные, так что при их преобразованиях в большинстве случаев необходимо заботиться о сохранении связи между ключом и значением. Исключение составляют толь ко две вышеупомянутые функции для индексирования по умолчанию. Во всех остальных случаях необходимо использовать похожие, но немного другие,функ ции, например asort ( ) и arsort ( ) . Как и первые две функции, эти сортируют массив по значению в прямом и обратном порядке, сохраняя соответствие между ключами и значениями.
Для сортировки по ключам с сохранением соответствия между ключами и значениями используется функция ksort ( ) . Для сортировки по ключам в об ратном порядке также с сохранением соответствия между ключами и значени ями из оригинального массива имеется функция krsort ( ) .
Функция shuffle () случайным образом меняет порядок значений в масси ве, сохраняя, однако, соответствие между ключами и значениями элементов. Чтобы показать сортировку массивов, создадим список студентов и отме ток, которые они получили за контрольную работу, затем оформим этот спи сок по отметкам и по именам.
Выполнение действия
- Откройте текстовый редактор и создайте новый РНРдокумент.
- Начните со стандартного кода документов HTML и РНР.
- Создайте массив.
- Напечатайте заголовок, а затем каждый элемент массива с помощью цикла.
- Отсортируйте массив по значениям в обратном порядке. Так в начале ока жутся фамилии студентов, получивших высшие отметки.
- Верните указатель массива в исходное положение с помощью функции
- Снова распечатайте массив (с заголовком) с помощью другого цикла.
- Теперь отсортируйте массив по ключу для получения списка имен студен тов в алфавитном порядке и снова восстановите цикл.
- В очередной раз распечатайте заголовок и массив.
- Закройте сценарий стандартными тэгами РНР и HTML.
- Сохраните сценарий как sort.php (листинг 7.5), загрузите его на сервер и протестируйте в браузере (рис.).
<HTMLxHEADxTITLE>Sorting Arrays</TITLEx/HEADxBODYx?php
$Grades = array(
"Richard"=>"95",
"Sherwood"= >"8 2 " ,
"Toni"=>"98",
"Franz"=>"87",
"Melissa"=>"75",
"Roddy"=>"85"
print ("Originally, the array looks like this:<BR>");
for ($n = 0; $n < count($Grades); $n++) {
$Line = each ($Grades);
print ("$Line[key]'s grade is $Line[value].<BR>\n");
arsort($Grades);
Мы определяем, кто получил лучшие отметки, поэтому необходимо исполь зовать вместо функции asort ( ) функцию arsort (). Первая функция сортиру ет массив в числовом порядке, и при ее использовании мы получили бы после довательность 75, 82, 85 и т.д., а не желаемую 98, 95, 87,...
Необходимо также использовать функцию arsort ( ) , а не rsort ( ) , чтобы со хранить взаимосвязь ключей со значениями. Просто rsort ( ) эту взаимосвязь не сохраняет, то есть имена студентов будут утрачены. Если вам нужен только список оценок, можете попробовать только функцию rsort ( ) .
reset().
reset($Grades);
Функция reset () возвращает указатель на первый элемент массива $Grade, с которого начинается новый цикл. Это необходимо делать, так как предыду щий цикл перемещает указатель в конец массива.
print ("<P>After sorting the array by key using arsort(),
—the array looks like this:<BR>");
for ($n = 0; $n < count($Grades); $n++) {
$Line= each ($Grades);
print ("$Line[key]'s grade is $Line[value].<BR>\n"};
}
ksort($Grades);
reset($Grades);
Функция ksort ( ) упорядочит массив по ключам (в нашем случае в алфа витном порядке), при этом взаимосвязь ключей и значений будет сохранена.
print ("<P>After. sorting the array by key using ksort ( ) ,
—the array looks like this:<BR>");
for ($n = 0;' $n < count ($Grades) ; $n+ + ) {
$Line= each ($Grades);
print ("$Line[key]'s grade is $Line[value].<BR>\n");
} '
?></BODYx/HTML>
Листинг 7.5 т Для сортировки массивов в РНР имеется много различных функций, включая используемые здесь arsort ( ) и ksort ( ) .
1 <HTML>
2 <HEAD>
3<TITLE>Sorting Arrays</TITLE>
4<BODY>
5<?php
6$Grades = array(
7"Richard."=>"95",
8"Sherwood"=>"82",
9"Toni"=>"98",
10"Franz"=>"87",
11"Melissa"=>"75",
12"Roddy"=>"85"
13);
14print ("Originally, the array looks like
this:<BR>i);5for ($n = 0; $n < count($Grades); $n++) {
15$Line = each ($Grades);
16 print ("$Line[key]'s grade is
17$Line [value] .<BR>\n") ;'
18} '
19arsort($Grades) ;
20reset($Grades);
21print ("<P>After sorting the array by
value using arsortO, the array looks
like this:<BR>");
22for ($n= 0; $n < count($Grades); $n++)
23$Line = each ($Grades);
24print ("$Ь1пе[1сеу]'s grade is
$Line[value].<BR>\n");
25}
26ksort($Gradee);
27reset($Grades);
28print ("<P>After sorting the array by key using ksortI
looks like this:<BR>");
29for ($n = 0; $n < count($Grades); $n++) {
30$Line= each ($Grades);
31print
32}
33?>
34</BODY>
35</HTML>