Поиск

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

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

Сортировка толькр по значениям элементов без учета ключей выполняется с помощью функции 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>