Usort: примеры (PHP)

Работа с usort в PHP: от основ до сложных примеров
Раздел: Работа с массивами
usort(array &array, callable callback): bool
Описание функции usort

Функция usort предназначена для сортировки массива по значениям с использованием пользовательской callback-функции сравнения. Применяется, когда стандартные методы сортировки не подходят и требуется задать собственную логику сравнения элементов.

Синтаксис:

usort(array &$array, callable $callback): bool

Аргументы:

  • $array - входной массив, который будет отсортирован (передается по ссылке)
  • $callback - функция сравнения, которая должна возвращать целое число: меньшее 0 если первый аргумент меньше второго, 0 если равны, большее 0 если первый больше второго. В PHP 7+ можно использовать оператор spaceship <=>

Возвращаемое значение: true в случае успеха, false при возникновении ошибки.

Примеры использования usort
Простая сортировка чисел
$numbers = [3, 1, 4, 1, 5, 9, 2, 6];
usort($numbers, function($a, $b) {
    return $a - $b;
});
print_r($numbers);
Array
(
    [0] => 1
    [1] => 1
    [2] => 2
    [3] => 3
    [4] => 4
    [5] => 5
    [6] => 6
    [7] => 9
)
Сортировка строк по длине
$words = ['яблоко', 'апельсин', 'груша', 'слива'];
usort($words, function($a, $b) {
    return strlen($a) <=> strlen($b);
});
print_r($words);
Array
(
    [0] => груша
    [1] => слива
    [2] => яблоко
    [3] => апельсин
)
Сортировка с флагами SORT_NATURAL
$files = ['img10.jpg', 'img2.jpg', 'img1.jpg'];
usort($files, function($a, $b) {
    return strnatcmp($a, $b);
});
print_r($files);
Array
(
    [0] => img1.jpg
    [1] => img2.jpg
    [2] => img10.jpg
)
Похожие функции в PHP
  • uasort - сортирует ассоциативный массив с сохранением ключей
  • uksort - сортирует массив по ключам с помощью callback-функции
  • asort - сортирует ассоциативный массив по значениям с сохранением ключей
  • ksort - сортирует массив по ключам
  • sort - стандартная сортировка массива по значениям

Функцию usort выбирают, когда требуется произвольная логика сравнения элементов. uasort применяют при необходимости сохранить ассоциацию ключей и значений. Стандартные функции сортировки эффективны для простых случаев.

Типичные ошибки
Неправильный возвращаемый тип
$arr = [3, 1, 2];
usort($arr, function($a, $b) {
    return $a > $b; // Ошибка: возвращает bool вместо int
});
// Результат непредсказуем, сортировка работает некорректно
Попытка сортировки не массива
$value = 'строка';
usort($value, function($a, $b) {
    return $a <=> $b;
});
// Warning: usort() expects parameter 1 to be array, string given
Изменение элементов массива внутри callback
$data = [['id' => 1], ['id' => 2]];
usort($data, function($a, $b) {
    $a['id'] = 5; // Не рекомендуется изменять элементы
    return $a['id'] <=> $b['id'];
});
Изменения в последних версиях PHP

В PHP 8.0.0 функция usort стала стабильной - элементы, сравнимые как равные, сохраняют свой первоначальный порядок. Ранее порядок равных элементов не был гарантирован.

В PHP 7.4.0 добавлена возможность использовать замыкания с автоматическим определением типа аргументов через стрелочные функции:

usort($array, fn($a, $b) => $a <=> $b);

С PHP 7.0.0 оператор spaceship <=> упрощает написание функций сравнения.

Расширенные примеры
Сортировка объектов по нескольким полям
Пример php
class Product {
    public function __construct(
        public string $name,
        public float $price,
        public int $rating
    ) {}
}

$products = [
    new Product('Товар A', 100, 4),
    new Product('Товар B', 100, 5),
    new Product('Товар C', 90, 4)
];

usort($products, function($a, $b) {
    return [$a->price, $b->rating] <=> [$b->price, $a->rating];
});

foreach ($products as $product) {
    echo "{$product->name}: {$product->price}, {$product->rating}\n";
}
Товар C: 90, 4
Товар B: 100, 5
Товар A: 100, 4
Сортировка многомерного массива
Пример php
$users = [
    ['name' => 'Анна', 'age' => 25, 'city' => 'Москва'],
    ['name' => 'Иван', 'age' => 30, 'city' => 'Санкт-Петербург'],
    ['name' => 'Петр', 'age' => 25, 'city' => 'Москва']
];

usort($users, function($a, $b) {
    if ($a['age'] !== $b['age']) {
        return $a['age'] <=> $b['age'];
    }
    return strcmp($a['city'], $b['city']);
});

print_r($users);
Array
(
    [0] => Array
        (
            [name] => Анна
            [age] => 25
            [city] => Москва
        )
    [1] => Array
        (
            [name] => Петр
            [age] => 25
            [city] => Москва
        )
    [2] => Array
        (
            [name] => Иван
            [age] => 30
            [city] => Санкт-Петербург
        )
)
Использование замыканий с внешними переменными
Пример php
$order = ['высокий', 'средний', 'низкий'];
$tasks = [
    ['name' => 'Задача 1', 'priority' => 'средний'],
    ['name' => 'Задача 2', 'priority' => 'высокий'],
    ['name' => 'Задача 3', 'priority' => 'низкий']
];

usort($tasks, function($a, $b) use ($order) {
    $posA = array_search($a['priority'], $order);
    $posB = array_search($b['priority'], $order);
    return $posA <=> $posB;
});

print_r($tasks);
Array
(
    [0] => Array
        (
            [name] => Задача 2
            [priority] => высокий
        )
    [1] => Array
        (
            [name] => Задача 1
            [priority] => средний
        )
    [2] => Array
        (
            [name] => Задача 3
            [priority] => низкий
        )
)
Рекурсивная сортировка вложенных массивов
Пример php
function sortNestedArray(&$array) {
    usort($array, function($a, $b) {
        if (is_array($a) && is_array($b)) {
            return count($a) <=> count($b);
        }
        return $a <=> $b;
    });
    
    foreach ($array as &$item) {
        if (is_array($item)) {
            sortNestedArray($item);
        }
    }
}

$data = [
    [3, 1, [9, 2]],
    [5, 4],
    [7, 6, 8]
];

sortNestedArray($data);
print_r($data);
Array
(
    [0] => Array
        (
            [0] => 4
            [1] => 5
        )
    [1] => Array
        (
            [0] => 6
            [1] => 7
            [2] => 8
        )
    [2] => Array
        (
            [0] => 1
            [1] => 3
            [2] => Array
                (
                    [0] => 2
                    [1] => 9
                )
        )
)
Аналоги в других языках

Usort в Python

# Сортировка с использованием key функции
items = ['яблоко', 'апельсин', 'груша']
sorted_items = sorted(items, key=len)
print(sorted_items)
['груша', 'яблоко', 'апельсин']

Usort в Javascript

// Использование функции сравнения
const numbers = [3, 1, 4, 1, 5];
numbers.sort((a, b) => a - b);
console.log(numbers);
[1, 1, 3, 4, 5]

Usort в MySQL

-- Сортировка с помощью ORDER BY и пользовательской логики
SELECT name, LENGTH(name) as len 
FROM fruits 
ORDER BY LENGTH(name);

Отличие PHP функции от аналогов: usort изменяет исходный массив, в то время как sorted() в Python возвращает новый список. В JavaScript метод sort() также изменяет исходный массив.

PHP usort function comments

En
Usort Sort an array by values using a user-defined comparison function