Сортировка массивов

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

Сортировка толькр по значениям элементов без учета ключей выполняется
с помощью функции sort ( ) . В обратном порядке и снова без учета ключей зна
чения распределяют с помощью функции rsort ( ) . Синтаксис функций выгля
дит следующим образом:


sort($Array);
rsort($Array);

После вызова функций изменится порядок элементов в массиве $Аггау. По
сути, из тех же элементов создается другой массив. Если массив был проиндек
сирован по умолчанию, числами начиная с нуля и заканчивая величиной
count ($Array) 1, то о новых значениях ключей можно*не заботиться. Однако,
если мы проиндексировали массив строками или числами в особом порядке,
то желательно не потерять связь между ключами и соответствующими значе
ниями. Для таких массивов имеется специальный термин ассоциативные мас
сивы, или хэши. Оказывается, в языке РНР все массивы ассоциативные, так
что при их преобразованиях в большинстве случаев необходимо заботиться
о сохранении связи между ключом и значением. Исключение составляют толь
ко две вышеупомянутые функции для индексирования по умолчанию. Во всех
остальных случаях необходимо использовать похожие, но немного другие,функ
ции, например asort ( ) и arsort ( ) . Как и первые две функции, эти сортируют
массив по значению в прямом и обратном порядке, сохраняя соответствие
между ключами и значениями.

Для сортировки по ключам с сохранением соответствия между ключами
и значениями используется функция ksort ( ) . Для сортировки по ключам в об
ратном порядке также с сохранением соответствия между ключами и значени
ями из оригинального массива имеется функция krsort ( ) .

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

Выполнение действия

  1. Откройте текстовый редактор и создайте новый РНРдокумент.
  2. Начните со стандартного кода документов HTML и РНР.
  3. <HTMLxHEADxTITLE>Sorting Arrays</TITLEx/HEADxBODYx?php

  4. Создайте массив.
  5. $Grades = array(
    "Richard"=>"95",
    "Sherwood"= >"8 2 " ,
    "Toni"=>"98",
    "Franz"=>"87",
    "Melissa"=>"75",
    "Roddy"=>"85"

  6. Напечатайте заголовок, а затем каждый элемент массива с помощью цикла.

  7. 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");

  8. Отсортируйте массив по значениям в обратном порядке. Так в начале ока
    жутся фамилии студентов, получивших высшие отметки.
  9. arsort($Grades);

    Мы определяем, кто получил лучшие отметки, поэтому необходимо исполь
    зовать вместо функции asort ( ) функцию arsort (). Первая функция сортиру
    ет массив в числовом порядке, и при ее использовании мы получили бы после
    довательность 75, 82, 85 и т.д., а не желаемую 98, 95, 87,…

    Необходимо также использовать функцию arsort ( ) , а не rsort ( ) , чтобы со
    хранить взаимосвязь ключей со значениями. Просто rsort ( ) эту взаимосвязь
    не сохраняет, то есть имена студентов будут утрачены. Если вам нужен только
    список оценок, можете попробовать только функцию rsort ( ) .

  10. Верните указатель массива в исходное положение с помощью функции

  11. reset().
    reset($Grades);

    Функция reset () возвращает указатель на первый элемент массива $Grade,
    с которого начинается новый цикл. Это необходимо делать, так как предыду
    щий цикл перемещает указатель в конец массива.

  12. Снова распечатайте массив (с заголовком) с помощью другого цикла.

  13. 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"};
    }

  14. Теперь отсортируйте массив по ключу для получения списка имен студен
    тов в алфавитном порядке и снова восстановите цикл.

  15. ksort($Grades);
    reset($Grades);

    Функция ksort ( ) упорядочит массив по ключам (в нашем случае в алфа
    витном порядке), при этом взаимосвязь ключей и значений будет сохранена.

  16. В очередной раз распечатайте заголовок и массив.

  17. 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");
    } '

  18. Закройте сценарий стандартными тэгами РНР и HTML.

  19. ?></BODYx/HTML>

  20. Сохраните сценарий как sort.php (листинг 7.5), загрузите его на сервер
    и протестируйте в браузере (рис.).
  21. Листинг 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>

Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: