Справочник по PHP - страница 12
Функция 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 "
";