САМОУЧИТЕЛЬ PHP 4


Сортировка по ключам при помощи функции 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() сохраняются, т. е., опять же, некоторые пары просто "всплывают"

наверх, а другие — "оседают".


Содержание раздела