Оператор <=> в PHP: сортировка и сравнение значений простыми словами
Если вы искали, что такое оператор <=> в PHP и зачем он нужен, короткий ответ такой: это удобный оператор сравнения, который возвращает -1, 0 или 1. Чаще всего он используется для сортировки данных: товаров по цене, пользователей по возрасту, статей по дате и так далее.
Что делает оператор <=> в PHP
Оператор <=> сравнивает левое и правое значение:
- возвращает -1, если левое значение меньше правого;
- возвращает 0, если значения равны;
- возвращает 1, если левое значение больше правого.
Простой пример:
echo 10 <=> 20; // -1
echo 20 <=> 20; // 0
echo 30 <=> 20; // 1
Название spaceship operator появилось из-за внешнего вида оператора: он действительно немного похож на космический корабль.
Зачем он нужен, если есть >, < и ==
Обычные операторы сравнения отвечают на вопрос «да или нет». Например, 10 > 5 вернёт true. А оператор <=> сразу сообщает порядок двух значений: меньше, равно или больше.
Без него код сравнения выглядел бы так:
function compareNumbers(int $a, int $b): int {
if ($a == $b) {
return 0;
}
return ($a < $b) ? -1 : 1;
}
С оператором <=> то же самое записывается в одну строку:
function compareNumbers(int $a, int $b): int {
return $a <=> $b;
}
Сортировка чисел через usort()
Самый частый практический сценарий — сортировка массива. Функция usort() принимает массив и callback-функцию сравнения. Эта функция как раз должна вернуть отрицательное число, ноль или положительное число.
$prices = [300, 100, 500, 200];
usort($prices, function ($a, $b) {
return $a <=> $b;
});
print_r($prices);
// [100, 200, 300, 500]
Для сортировки по убыванию достаточно поменять значения местами:
$prices = [300, 100, 500, 200];
usort($prices, function ($a, $b) {
return $b <=> $a;
});
print_r($prices);
// [500, 300, 200, 100]
Сортировка массива пользователей по возрасту
Оператор <=> особенно удобен при работе с массивами ассоциативных массивов. Например, отсортируем пользователей по возрасту:
$users = [
['name' => 'Анна', 'age' => 25],
['name' => 'Иван', 'age' => 19],
['name' => 'Олег', 'age' => 32],
];
usort($users, function ($a, $b) {
return $a['age'] <=> $b['age'];
});
print_r($users);
Результат: сначала Иван, затем Анна, затем Олег.
В PHP 7.4+ можно записать короче с помощью стрелочной функции:
usort($users, fn($a, $b) => $a['age'] <=> $b['age']);
Сортировка по нескольким полям
Иногда нужно сортировать не только по одному критерию. Например, сначала по возрасту, а если возраст одинаковый — по имени.
$users = [
['name' => 'Олег', 'age' => 25],
['name' => 'Анна', 'age' => 25],
['name' => 'Иван', 'age' => 19],
];
usort($users, function ($a, $b) {
return ($a['age'] <=> $b['age'])
?: ($a['name'] <=> $b['name']);
});
print_r($users);
Здесь используется сокращённый оператор ?:. Если сравнение возраста вернуло не 0, PHP сразу использует этот результат. Если возраст одинаковый, выполняется сравнение имён.
Сравнение строк
Оператор <=> можно применять и к строкам:
echo 'apple' <=> 'banana'; // -1
echo 'cat' <=> 'cat'; // 0
echo 'dog' <=> 'cat'; // 1
Но важно понимать: строковое сравнение зависит от правил PHP и не всегда подходит для красивой сортировки русских слов или сортировки «как в словаре». Для сложной локализованной сортировки лучше использовать расширение intl и класс Collator, если оно доступно.
Сортировка товаров по цене и названию
Рассмотрим более реальный пример: список товаров нужно отсортировать по цене, а товары с одинаковой ценой — по названию.
$products = [
['title' => 'Клавиатура', 'price' => 2500],
['title' => 'Мышь', 'price' => 1200],
['title' => 'Коврик', 'price' => 1200],
['title' => 'Монитор', 'price' => 15000],
];
usort($products, function ($a, $b) {
return ($a['price'] <=> $b['price'])
?: ($a['title'] <=> $b['title']);
});
foreach ($products as $product) {
echo $product['title'] . ': ' . $product['price'] . PHP_EOL;
}
Такой подход часто встречается в интернет-магазинах, админках, каталогах и личных кабинетах.
Важный нюанс: типы данных
Оператор <=> использует обычные правила сравнения PHP. Это значит, что смешивание типов может дать неожиданный результат, особенно если сравнивать числа и строки.
var_dump('10' <=> 2); // 1, строка '10' будет сравнена как число
var_dump('abc' <=> 2); // результат зависит от правил сравнения строк и чисел
Практический совет: перед сортировкой приводите данные к ожидаемому типу. Если цена должна быть числом — сделайте её числом заранее.
$aPrice = (float) $a['price'];
$bPrice = (float) $b['price'];
return $aPrice <=> $bPrice;
Сравнение дат
Если даты хранятся в формате Y-m-d, их можно сравнивать как строки, потому что такой формат сортируется корректно:
$posts = [
['title' => 'Новость 1', 'date' => '2026-01-10'],
['title' => 'Новость 2', 'date' => '2025-12-01'],
['title' => 'Новость 3', 'date' => '2026-02-15'],
];
usort($posts, fn($a, $b) => $b['date'] <=> $a['date']);
print_r($posts);
Если дата хранится в другом формате, например 10.01.2026, лучше сначала преобразовать её через strtotime() или DateTime.
Частые ошибки новичков
- Путать направление сортировки. Для возрастания используйте $a <=> $b, для убывания — $b <=> $a.
- Сравнивать неподготовленные данные. Строки с ценами, пустые значения и null лучше обработать заранее.
- Ожидать true или false. Оператор возвращает не булево значение, а число: -1, 0 или 1.
- Использовать для сложной сортировки текста. Для языковой сортировки русских строк может понадобиться Collator.
Мини-шпаргалка
// По возрастанию
usort($items, fn($a, $b) => $a <=> $b);
// По убыванию
usort($items, fn($a, $b) => $b <=> $a);
// По полю массива
usort($users, fn($a, $b) => $a['age'] <=> $b['age']);
// По двум полям
usort($users, fn($a, $b) =>
($a['age'] <=> $b['age']) ?: ($a['name'] <=> $b['name'])
);
Если вы хотите не просто запомнить отдельные операторы, а уверенно писать полноценные сайты на PHP с базой данных, формами, авторизацией и практическими проектами, посмотрите курс «PHP и MySQL с Нуля до Гуру 3.0» — понятный путь от основ к реальной разработке.
Итог
Оператор <=> в PHP — простой, но очень полезный инструмент. Он делает функции сравнения короче и особенно хорошо раскрывается вместе с usort(). Используйте его для сортировки чисел, строк, массивов объектов или ассоциативных массивов, но не забывайте следить за типами данных и форматом значений.
-
Создано 06.11.2026 17:00:47
-
Михаил Русаков

Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.