Начнем с самого простого — сортировки массивов. В PHP для этого существует очень много функций. С их помощью можно сортировать ассоциативные массивы и списки в порядке возрастания или убывания, а также в том порядке, в каком вам необходимо — посредством пользовательской функции сортировки.
Сортировка массива по значениям c помощью функций asort() и arsort():
Функция asort() сортирует массив, указанный в ее параметре, так, чтобы его значения шли в алфавитном (если это строки) или в возрастающем (для чисел) порядке. При этом сохраняются связи между ключами и соответствующими им значениями, т. е. некоторые пары ключ=>значение просто "всплывают" наверх, а некоторые — наоборот, "опускаются". Например:
$A=array("a"=>"Zero","b"=>"Weapon","c"=>"Alpha","d"=>"Processor"); asort($A); foreach($A as $k=>$v) echo "$k=>$v "; // выводит "c=>Alpha d=>Processor b=>Weapon a=>Zero" // как видим, поменялся только порядок пар ключ=>значение
Функция arsort() выполняет то же самое, за одним исключением: она упорядочивает массив не по возрастанию, а по убыванию.
Сортировка по ключам с помощью функций ksort() и krsort():
Функция ksort() практически идентична функции asort(), с тем различием, что сортировка осуществляется не позначениями, а по ключам (в порядке возрастания). Например:
Функция для сортировки по ключам в обратном порядке называется krsort() и применяется точно в таком же контексте, что и ksort().
Сортировка по ключам при помощи функции uksort():
Довольно часто нам приходится сортировать что-то по более сложному критерию, чем просто по алфавиту. Например, пусть в $Files хранится список имен файлов и подкаталогов в текущем каталоге. Возможно, мы захотим вывести этот список не только в лексикографическом порядке, но также и чтобы все каталоги предшествовали файлам. В этом случае нам стоит воспользоваться функцией uksort(), написав предварительно функцию сравнения с двумя параметрами, как того требует uksort().
<?php // Эта функция должна сравнивать значения $f1 и $f2 и возвращать: // -1, если $f1<$f2, // 0, если $f1==$f2 // 1, если $f1>$f2 // Под < и > понимается следование этих имен в выводимом списке function FCmp($f1,$f2) { // Каталог всегда предшествует файлу if(is_dir($f1) && !is_dir($f2)) return -1; // Файл всегда идет после каталога if(!is_dir($f1) && is_dir($f2)) return 1; // Иначе сравниваем лексикографически if($f1<$f2) return -1; elseif($f1>$f2) return 1; else return 0; } // Пусть $Files содержит массив с ключами — именами файлов // в текущем каталоге. Отсортируем его. uksort($Files,"FCmp"); // передаем функцию сортировки "по ссылке" ?>
Конечно, связи между ключами и значениями функцией uksort() сохраняются, т. е., опять же, некоторые пары просто "всплывают" наверх, а другие — "оседают".