Сортировка по ключам при помощи функции uksort()
Довольно часто нам приходится сортировать что-то по более сложному критерию, чем просто по алфавиту. Например, пусть в $Files хранится список имен файлов и подкаталогов в текущем каталоге. Возможно, мы захотим вывести этот список не только в лексикографическом порядке, но также и чтобы все каталоги предшествовали файлам. В этом случае нам стоит воспользоваться функцией uksort(), написав предварительно функцию сравнения с двумя параметрами, как того требует uksort().
О функциях мы поговорим в главе 14, а пока, я надеюсь, все должно быть ясно из примера (листинг13.1).
Листинг 13.1. Сортировка с помощью пользовательской функции
// Ýòà ôóíêöèÿ äîëæíà ñðàâíèâàòü çíà÷åíèÿ $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() сохраняются, т. е., опять же, некоторые пары просто "всплывают"
наверх, а другие — "оседают".