Uasort: примеры (PHP)
uasort(array &array, callable callback): boolФункция uasort в PHP
Функция uasort выполняет сортировку элементов массива с сохранением связи ключ-значение (ассоциативных индексов). Она применяется, когда необходимо упорядочить данные по значениям, но при этом сохранить оригинальные ключи массива.
Функция принимает два параметра:
- array &$array - массив, который требуется отсортировать. Передается по ссылке.
- 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
)$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
Модификация исходного массива в функции сравнения вызывает неопределенное поведение.
$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
Если параметр callback ожидает два обязательных аргумента, а функция сравнения передает только один, будет выброшена ошибка ArgumentCountError. Ранее выдавалось предупреждение.
Добавлена поддержка стрелочных функций, что упрощает запись callback.
Была добавлена поддержка объектов в массиве, которые можно сравнивать с помощью оператора <=> (spaceship).
Расширенные примеры
$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
)
)$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
)
)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
)
)$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 сортирует результаты, но не сохраняет структуру таблицы. Аналога для ассоциативных массивов нет.