среда, 21 ноября 2012 г.

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


Функция sort() позволяет отсортировать список в
алфавитном порядке, а функция rsort() — в обратном
порядке:
  $Mass = array('Один', 'Два', 'Три', 'Четыре');
  sort($Mass);
  print_r($Mass);
  // Array ( [0] => Два [1] => Один [2] => Три [3] => Четыре )
                  rsort($Mass);
                  print_r($Mass);
// Array ( [0] => Четыре [1] => Три [2] => Один [3] => Два )



Отсортировать ассоциативный массив можно или по ключам, или по 
значениям. Для этого используются следующие функции:
  asort() — сортировка по значениям в алфавитном порядке;
  arsort() — сортировка по значениям в обратном порядке:
  

  $Mass['Один'] = 1;
  $Mass['Два'] = 2;
  $Mass['Три'] = 3;
  $Mass['Четыре'] = 4;
  arsort($Mass);
  print_r($Mass);
  // Array ( [Четыре] => 4 [Три] => 3 [Два] => 2 [Один] => 1 )


  ksort() — сортировка по ключам в алфавитном порядке;
  krsort() — сортировка по ключам в обратном порядке:

  $Mass['Один'] = 1;
  $Mass['Два'] = 2;
  $Mass['Три'] = 3;
  $Mass['Четыре'] = 4;
  krsort($Mass);
  print_r($Mass);
  // Array ( [Четыре] => 4 [Три] => 3 [Один] => 1 [Два] => 2 )


Если нужно изменить порядок стандартной сортировки, можно задать свою
сортировку с помощью следующих функций:

  usort() — для пользовательской сортировки списков;
  uksort() — для пользовательской сортировки ассоциативных массивов
по ключам;
 uasort() — для пользовательской сортировки ассоциативных массивов
по значениям.

В качестве первого аргумента этим функциям передается массив, а второй
аргумент должен содержать имя функции, сравнивающей два элемента.
Функция сравнения принимает две переменные и должна возвращать:

   1 — если первый больше второго;
  -1 — если второй больше первого;
   0 — если элементы равны.
Например, стандартная сортировка зависит от регистра символов:
  $Mass = array('единица1', 'Единый', 'Единица2');
  sort($Mass);
  print_r($Mass);
  // Array ( [0] => Единица2 [1] => Единый [2] => единица1 )


В результате мы получим неправильную сортировку, ведь Единый и Единица2
больше единица1. Изменим стандартную сортировку на свою сортировку, не
учитывающую регистр.

Пользовательская сортировка
  function f_sort($Str1, $Str2) { // Сортировка без учета регистра

   $Str1_1 = strtolower($Str1); // Преобразуем к нижнему регистру

   $Str2_1 = strtolower($Str2); // Преобразуем к нижнему регистру
   if ($Str1_1>$Str2_1) return 1;
   if ($Str1_1<$Str2_1) return -1;
   return 0;
  }
  setlocale(LC_CTYPE, "ru_RU.CP1251"); // Настройка локали
  $Mass = array('единица1', 'Единый', 'Единица2');
  usort($Mass, "f_sort");
  print_r($Mass);
  // Array ( [0] => единица1 [1] => Единица2 [2] => Единый )


Для получения правильной сортировки мы приводим две переменные к 
одному регистру, а затем производим стандартное сравнение. Заметьте, 
что регистр самих элементов массива не изменяется, так как мы работаем 
с их копиями. Для правильной работы функции strtolower() с русским 
языком необходимо настроить локаль. Это позволяет сделать функция 
setlocale()Более подробно мы рассмотрим функцию setlocale() при 
изучении функций обработки строк.












Комментариев нет:

Отправить комментарий