Справочник по PHP - страница 12

Шрифт
Интервал

стр.

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

Функция uksort() возвращает true в случае успешного завершения сортировки, и FALSE в противном случае.

Довольно часто нам приходится сортировать что-то по более сложному критерию, чем просто по алфавиту. Например, пусть в $Files храниться список имен файлов и подкаталогов в текущем каталоге. Возможно, мы захотим вывести этот список не только в лексографическом порядке, но также чтобы все каталоги предшествовали файлам. В этом случае нам стоит воспользоваться функцией uksort(), написав предварительно функцию сравнения с двумя параметрами, как того требует uksort().

1 пример использования функции uksort():

>// Эта функция должна сравнивать значения $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"); //передаем функцию сортировки "по ссылке"


2 пример использования функции uksort():

>

>function cmp($a, $b)

>{

> if ($a == $b) {

> return 0;

> }

> return ($a > $b) ? -1 : 1;

>}


>$a = array(4 => "four", 3 => "three", 20 => "twenty", 10 => "ten");


>uksort($a, "cmp");


>while (list($key, $value) = each($a)) {

> echo "$key: $valuen";

>}

?>

Этот пример выведет:

20: twenty10: ten4: four3: three

Функция поддерживается PHP 3 =3.0.4, PHP 4, PHP 5


usort


Пользоваетльская сортировка значений массива.

Синтаксис:

bool usort(array arr, callback cmp_function)

Функция usort() сортирует массив arr без сохраненя индексных ассоциаций, используя для сравнения значений пользовательскую функцию, указанную в аргументе cmp_function. В эту функцию передаются два сравниваемых индекса элементов, а она должна вернуть положительное или отрицательное число или 0.

Эта функция как бы является "гибридом" функций uasort() и sort(). От sort() она отличается тем, что критерий сравнения обеспечивается пользовательской функцией. А от uasort() - тем, что она не сохраняет связей между ключами и значениями, а потому пригодна разве что для сортировки списков.

Пример использования функции usort():

>

>function cmp($a, $b)

>{

> if ($a == $b) {

> return 0;

> }

> return ($a < $b) ? -1 : 1;

>}


>$a = array(3, 2, 5, 6, 1);


>usort($a, "cmp");


>while (list($key, $value) = each($a)) {

> echo "$key: $valuen";

>}

?>

Пример одномерного массива:

>function cmp($a, $b) {

> if($a==$b) return 0;

> return ($a > $b) ? -1 : 1;

>}

>$a=array (3,2,5,6,1);

>usort($a, "cmp");

>while(list($key,$val)=each($a)) {

> echo "$key: $valn";

>}


При выполнении будет напечатано:

0: 61: 52: 33: 24: 1

Пример многомерного массива:

>function cmp($a,$b) {

> return strcmp($a["fruit"],$b["fruit"]);

>};

>$fruit[0]["fruit"]="lemons";

>$fruit[1]["fruit"]="apples";

>$fruit[2]["fruit"]="grapes";


>usort($fruit, "cmp");


>while(list($key,$val)=each($fruit)) {

> echo "$fruit[$key]:".$val["fruit"]."n";

>}


При сортировке многомерных массивов $a и $b содержит ссылки на первый индекс массива.

Будет напечатано:

$fruit[0]: apples$fruit[1]: grapes$fruit[2]: lemons

Если необходимо отсортировать массив с различными вторыми ключами, можно поступить следующим образом:

>

>function arr_sort($a,$b) {

> list($key1,$val)=each($a);

> list($key2,$val)=each($b);

> return strcmp($a[$key1],$b[$key2]);

>};


>$arr[0]["1-ый элемент"]="яблока";

>$arr[1]["2-ый элемент"]="груша";

>$arr[2]["3-ый элемент"]="персик";

>$arr[3]["4-ый элемент"]="дыня";

>$arr[4]["5-ый элемент"]="малина";

>$arr[5]["6-ый элемент"]="ананас";


>usort($arr,"arr_sort");


>echo "

";


стр.

Похожие книги