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

Руководство по применению uasort для сортировки данных
Раздел: Работа с массивами
uasort(array &array, callable callback): bool

Функция uasort в PHP

Назначение

Функция uasort выполняет сортировку элементов массива с сохранением связи ключ-значение (ассоциативных индексов). Она применяется, когда необходимо упорядочить данные по значениям, но при этом сохранить оригинальные ключи массива.

Аргументы

Функция принимает два параметра:

  1. array &$array - массив, который требуется отсортировать. Передается по ссылке.
  2. callable $callback - пользовательская функция сравнения. Принимает два аргумента (значения элементов) и возвращает целое число:
    • Отрицательное, если первый аргумент меньше второго.
    • Ноль, если аргументы равны.
    • Положительное, если первый аргумент больше второго.

Примеры использования uasort

Сортировка ассоциативного массива строк
$fruits = [
    'a' => 'orange',
    'b' => 'apple',
    'c' => 'banana'
];
function cmp($a, $b) {
    return strcmp($a, $b);
}
uasort($fruits, 'cmp');
print_r($fruits);
Array
(
    [b] => apple
    [c] => banana
    [a] => orange
)
Сортировка по числовым значениям
$numbers = ['one' => 5, 'two' => 2, 'three' => 8];
uasort($numbers, function($a, $b) {
    return $a <=> $b;
});
print_r($numbers);
Array
(
    [two] => 2
    [one] => 5
    [three] => 8
)
Использование стрелочной функции (PHP 7.4+)
$data = ['x' => 10, 'y' => 1, 'z' => 5];
uasort($data, fn($a, $b) => $a <=> $b);
print_r($data);
Array
(
    [y] => 1
    [z] => 5
    [x] => 10
)

Похожие функции в PHP

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

Сортирует массив по ключам с использованием пользовательской функции сравнения.

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

Выбор функции

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

Типичные ошибки

Возврат нецелого числа

Функция сравнения должна возвращать integer. Нецелое число приводит к неожиданному поведению.

$arr = ['a' => 1.5, 'b' => 1.2];
uasort($arr, function($a, $b) {
    return $a - $b; // Для 1.5 и 1.2 вернет 0.3 (float)
});
var_dump($arr);
// Результат может быть некорректным в зависимости от версии PHP
Изменение массива внутри callback

Модификация исходного массива в функции сравнения вызывает неопределенное поведение.

$arr = ['a' => 3, 'b' => 1, 'c' => 2];
uasort($arr, function($a, $b) use (&$arr) {
    unset($arr['a']); // Опасное действие
    return $a <=> $b;
});
// Непредсказуемый результат, возможны ошибки
Некорректное сравнение строк с числами
$arr = ['a' => '10', 'b' => 2];
uasort($arr, function($a, $b) {
    return $a - $b; // Сравнение строки и числа
});
print_r($arr);
Array
(
    [b] => 2
    [a] => 10
)

Изменения в версиях PHP

PHP 8.0.0

Если параметр callback ожидает два обязательных аргумента, а функция сравнения передает только один, будет выброшена ошибка ArgumentCountError. Ранее выдавалось предупреждение.

PHP 7.4.0

Добавлена поддержка стрелочных функций, что упрощает запись callback.

PHP 7.0.0

Была добавлена поддержка объектов в массиве, которые можно сравнивать с помощью оператора <=> (spaceship).

Расширенные примеры

Сортировка многомерного массива
Пример php
$users = [
    'u1' => ['name' => 'John', 'age' => 30],
    'u2' => ['name' => 'Alice', 'age' => 25],
    'u3' => ['name' => 'Bob', 'age' => 35]
];
uasort($users, function($a, $b) {
    return $a['age'] <=> $b['age'];
});
print_r($users);
Array
(
    [u2] => Array
        (
            [name] => Alice
            [age] => 25
        )
    [u1] => Array
        (
            [name] => John
            [age] => 30
        )
    [u3] => Array
        (
            [name] => Bob
            [age] => 35
        )
)
Сортировка по нескольким полям
Пример php
$products = [
    'p1' => ['price' => 100, 'rating' => 4],
    'p2' => ['price' => 100, 'rating' => 5],
    'p3' => ['price' => 50, 'rating' => 3]
];
uasort($products, function($a, $b) {
    if ($a['price'] === $b['price']) {
        return $b['rating'] <=> $a['rating']; // По убыванию рейтинга
    }
    return $a['price'] <=> $b['price']; // По возрастанию цены
});
print_r($products);
Array
(
    [p3] => Array
        (
            [price] => 50
            [rating] => 3
        )
    [p2] => Array
        (
            [price] => 100
            [rating] => 5
        )
    [p1] => Array
        (
            [price] => 100
            [rating] => 4
        )
)
Сортировка объектов
Пример php
class User {
    public function __construct(public string $name, public int $age) {}
}
$users = [
    'a' => new User('John', 30),
    'b' => new User('Alice', 25)
];
uasort($users, fn($a, $b) => $a->age <=> $b->age);
print_r($users);
Array
(
    [b] => User Object
        (
            [name] => Alice
            [age] => 25
        )
    [a] => User Object
        (
            [name] => John
            [age] => 30
        )
)
Сортировка с использованием внешних переменных
Пример php
$order = ['apple', 'orange', 'banana'];
$fruits = ['f1' => 'orange', 'f2' => 'banana', 'f3' => 'apple'];
uasort($fruits, function($a, $b) use ($order) {
    $posA = array_search($a, $order);
    $posB = array_search($b, $order);
    return $posA <=> $posB;
});
print_r($fruits);
Array
(
    [f3] => apple
    [f1] => orange
    [f2] => banana
)

Аналоги в других языках

Uasort в Python

Функция sorted() с параметром key или list.sort() для сортировки с сохранением порядка. Для словарей используют OrderedDict.

fruits = {'a': 'orange', 'b': 'apple', 'c': 'banana'}
sorted_fruits = dict(sorted(fruits.items(), key=lambda item: item[1]))
print(sorted_fruits)
{'b': 'apple', 'c': 'banana', 'a': 'orange'}

Uasort в Javascript

Метод Object.entries() с сортировкой и преобразованием обратно в объект. Объекты в JS не гарантируют порядок ключей, но современные движки сохраняют порядок добавления.

let fruits = { a: 'orange', b: 'apple', c: 'banana' };
let sorted = Object.fromEntries(
    Object.entries(fruits).sort(([,a], [,b]) => a.localeCompare(b))
);
console.log(sorted);
{ b: 'apple', c: 'banana', a: 'orange' }

Uasort в MySQL

В запросах ORDER BY сортирует результаты, но не сохраняет структуру таблицы. Аналога для ассоциативных массивов нет.

PHP uasort function comments

En
Uasort Sort an array with a user-defined comparison function and maintain index association