uksort(), uasort() и usort() — пользовательская сортировка массивов.
Сортировка массива по значению. Функции asort() и arsort()
Функция asort() выполняет сортировку массива по значениям элементов. При этом она располагает элементы массива таким образом, что их значения шли в алфавитном порядке (если это строки) или в возрастающем порядке (если это числа). Функция arsort() выполняет сортировку по значениям в обратном порядке.Предположим, что у нас есть такой массив:
$FIO = array («Sidorov» => «Nikolay», «Ivanov” => «Alexandr», «Petrov» => «Petr»);
После выполнения функции asort($FIO) наш массив будет преобразован следующим образом:
array («Ivanov» => «Alexandr», «S?dorov» => «Nikolay», «Petrov» => «Petr»);
Для сортировки по ключам используется функция ksort(). При этом сортировка осуществляется по таким же принципам, что и функцией asort(), только не по значению, а по ключам. Если передать ей наш массив $FIO, то мы получим такой результат:
array (“Ivanov» => «Alexandr», «Petrov» => «Petr», «Sidorov» => «Nikolay»);
Сравните полученный результат с результатом функции asort(). Для сортировки ключей в обратном порядке используется функция krsort().
Сортировка списка. Функция sort()
Все четыре рассмотренные функции не разрывают пары ключ => значение. Это очень важно. Например, у нас есть небольшой список:
$People = array («Ivanov» => «555-6677”, “Sidorov» => «345-4567», «Petrov» => «777-5653»);После сортировки массива по ключам наш список будет выглядеть так:
$People = array («Ivanov» => «555-6677», «Petrov» => «777-5653», «Sidorov” => «345-4567»);
Обратите внимание: пары ключ => значение не разорваны, то есть у Петрова по-прежнему номер телефона 777-5653, а у Сидорова — 345-4567. Если бы пары были разорваны, номер телефона у Петрова был 345-4567, а у Сидорова — 777-5653, то есть, наоборот.
Если вам нужно отсортировать список, то удобнее всего использовать функцию sort(). Данная функция разрывает пары ключ => значение, поэтому ее нужно использовать только для списков.
Пусть у нас есть список:
$List = array («Name», «Address», «Email»);
Если вывести список в виде ключ => значение, то мы получим следующий результат:
0 => Name1 => Address
2 => Email
После сортировки sort($List) у нас получится следующий список:
0 => Address1 => Email
2 => Name
Изначальная связь между парами ключ => значение была разорвана. Возникнет как раз та ситуация, которую мы рассматривали на примере с номерами телефонов.
Переворачивание массива. Функция array_reverse()
Для переворачивания массива используется функция array_reverse(). Эта функция возвращает массив, элементы которого следуют в обратном порядке относительно исходного массива. Например, чтобы отсортировать массив в обратном порядке, можно использовать функцию arsort(), а можно упорядочить массив в прямом порядке функцией asort() и перевернуть его функцией array_reverse().
Примечание.
Если вам нужно отсортировать массив в обратном алфавитном порядке, я рекомендую использовать функцию arsort() — она работает быстрее, чем последовательность функций asort() и array_reverse().
Перемешивание списков. Функция shuffle()
Функция shuffle(), так сказать, «перемешивает» список, то есть значения результирующего списка будут размещены в случайном порядке. Данная функция полностью изменяет массив, поэтому ее можно использовать только для списков.
Перед вызовом этой функции нужно инициализировать генератор случайных чисел, иначе при каждом новом вызове функции shuffle() результат перемешивания будет один и тот же (при перемешивании одного и того же массива). Для инициализации генератора случайных чисел используется функция mt_srand():
mt_srand(time()*100000);
shuffle($Arr);
Примечание.
Для генерирования случайных чисел рекомендуется использовать функции mt_rand() и mt_srand() вместо стандартных rand() и srand(), поскольку первые обеспечивают лучшее качество генерируемых случайных чисел.
Пользовательская сортировка массивов. Функции uksort(), uasort() и usort()
Иногда нужно отсортировать массив не в алфавитном порядке, а по более сложному критерию. Для этого используются функции uksort(), uasort() и usort() — пользовательские функции сортировки массивов. Каждой функции нужно передать два параметра:- массив, который нужно отсортировать;- функцию сравнения, которая определит, какой из элементов массива меньше, а какой больше, согласно нашему критерию.
Функции сравнения нужно передать два параметра — два элемента массива ($el_1 и $el_2). В свою очередь, функция должна возвратить одно
из трех значений:
-1, если $el_1 < $el_2;0, если $el_1 = $el_2;
1, если $el_1 > $еl_2.
Предположим, что у нас есть список файлов и каталогов — $FilesNDirs. Нам нужно вывести сначала каталоги, а потом файлы. Сравнение будет производиться функцией Cmp, которую мы сами и напишем (смотрите код ниже).
Функция сравнения Cmp
function cmp ($el_1, $el_2)// Сначала каталог, а потом – файлif (is_dir($el_1) && !is_dir($el_2)) return -1;if (!is_dir($el_1) && is_dir($el_2)) return 1;// Сравниваем по алфавитуif ($el_1 < $el_2) return -1;elseif ($el_1 > $el_2) return 1;else return 0;}Теперь вызовем функцию uasort():
uasort ($FilesNDirs,»cmp»);
Примечание.
В данном случае мы используем uasort() потому, что у нас простой список, а не ассоциативный массив. В последнем случае нужно было использовать функцию uksort().
Функция uasort() аналогична функции uksort(), только она сортирует не ключи, как uksort, а значения. Обе функции — uksort() и uasort() — сохраняют пары ключ => значение.
Функция usort() похожа на функцию sort(), но критерий сортировки задается пользовательской функцией, которая передается в качестве второго параметра. Еще одна важная особенность этой функции заключается в том, что она не сохраняет пару ключ => значение, поэтому пригодна лишь для сортировки списков, но ее ни в коем случае не нужно использовать для сортировки ассоциативных массивов.