Usort: примеры (PHP)
usort(array &array, callable callback): boolФункция usort предназначена для сортировки массива по значениям с использованием пользовательской callback-функции сравнения. Применяется, когда стандартные методы сортировки не подходят и требуется задать собственную логику сравнения элементов.
Синтаксис:
usort(array &$array, callable $callback): bool
Аргументы:
- $array - входной массив, который будет отсортирован (передается по ссылке)
- $callback - функция сравнения, которая должна возвращать целое число: меньшее 0 если первый аргумент меньше второго, 0 если равны, большее 0 если первый больше второго. В PHP 7+ можно использовать оператор spaceship
<=>
Возвращаемое значение: true в случае успеха, false при возникновении ошибки.
$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] => апельсин
)$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
)- 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$data = [['id' => 1], ['id' => 2]];
usort($data, function($a, $b) {
$a['id'] = 5; // Не рекомендуется изменять элементы
return $a['id'] <=> $b['id'];
});В PHP 8.0.0 функция usort стала стабильной - элементы, сравнимые как равные, сохраняют свой первоначальный порядок. Ранее порядок равных элементов не был гарантирован.
В PHP 7.4.0 добавлена возможность использовать замыкания с автоматическим определением типа аргументов через стрелочные функции:
usort($array, fn($a, $b) => $a <=> $b);С PHP 7.0.0 оператор spaceship <=> упрощает написание функций сравнения.
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
$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] => Санкт-Петербург
)
)$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] => низкий
)
)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() также изменяет исходный массив.