uksort ()

Сортування за допомогою функції, створеної користувачем

Крім двох простих способів сортування значень масиву (за спаданням або за зростанням) PHP пропонує користувачеві можливість самому задавати критерії для сортування даних. Критерій задається за допомогою функції, ім'я якої вказується в якості аргументу для спеціальних функцій сортування usort () або uksort (). За назвами цих функцій можна здогадатися, що usort () сортує значення елементів масиву, а uksort () - значення ключів масиву за допомогою певної функції користувача. Обидві функції повертають true, якщо сортування пройшла успішно, і false - в протилежному випадку. Їх синтаксис виглядає наступним чином:

usort (масив, сортуюча функція)
uksort (масив, сортуюча функція)

Звичайно ж, не можна сортувати масив за допомогою будь-якої функції користувача. Ця функція повинна задовольняти певним критеріям, що дозволить порівнювати елементи масиву. Яка повинна бути структура функції сортування? По-перше, вона повинна мати два аргументи. У них інтерпретатор буде передавати пари значень елементів для функції usort () або ключів масиву для функції uksort (). По-друге, функція, що сортує повинна повертати:

  • ціле число, менше нуля, якщо перший аргумент менше другого;
  • число, рівне нулю, якщо два аргументи рівні;
  • число більше за нуль, якщо перший аргумент більше другого.

Як і для інших функцій сортування, для функції usort () існує аналог, що не змінює значення ключів, - функція uasort ().

Приклад. Припустимо, у нас є масив, який містить такі відомості про літературні твори, як назва, автор і рік створення. Ми хочемо впорядкувати книги за датою створення.

<? Php
// Масив виглядає таким чином:
$books = array ("Герой нашого часу" =>
array ("Лермонтов", 1840),
"Руслан і Людмила" => array ("Пушкін", 1820),
"Війна і мир" => array ("Толстой", 1863),
"Ідіот" => array ("Достоєвський", 1868));
/* Можна, звичайно переписати цей масив
по-іншому, зробивши рік видання, наприклад,
індексом, але набагато зручніше написати свою
функцію для сортування * /

uasort ($books, "cmp");
// Сортуємо масив за допомогою функції cmp

foreach ($books as $key => $book) {
echo "$ book [0]: \" $ key \ "<br>";
}
function cmp ($a, $b) {
// Функція, що визначає спосіб сортування
if ($a [1] <$b[1]) return -1;
elseif ($a [1] == $b [1]) return 0;
else return 1;
}
?>

У результаті отримаємо:

Пушкін: "Руслан і Людмила"
Лермонтов: "Герой нашого часу"
Толстой: "Війна і мир"
Достоєвський: "Ідіот"