PHP: сортировка массива по ключу 'price' usort uasort
Как отсортировать ассоциативный массив по значению ключа 'price' в убывающем порядке в PHP. Примеры с usort, uasort, array_multisort для многомерных массивов. Сравнение методов и код для вашего $inventory.
Как отсортировать массив ассоциативных массивов по значению ключа (столбца) в PHP?
Дан следующий массив:
$inventory = array(
array("type"=>"fruit", "price"=>3.50),
array("type"=>"milk", "price"=>2.90),
array("type"=>"pork", "price"=>5.43),
);
Хочу отсортировать элементы по цене в убывающем порядке, чтобы получить:
$inventory = array(
array("type"=>"pork", "price"=>5.43),
array("type"=>"fruit", "price"=>3.50),
array("type"=>"milk", "price"=>2.90),
);
Какие функции или методы использовать для сортировки по ключу ‘price’?
В PHP проще всего отсортировать массив ассоциативных массивов по значению ключа вроде ‘price’ в убывающем порядке с помощью функции usort. Для вашего примера $inventory подойдет такой код: usort($inventory, function($a, $b) { return $b['price'] <=> $a['price']; }); — и массив сразу станет array("type"=>"pork", "price"=>5.43), array("type"=>"fruit", "price"=>3.50), array("type"=>"milk", "price"=>2.90). Альтернативы вроде uasort или array_multisort тоже работают, если нужны ключи или несколько полей.
Содержание
- Как отсортировать массив в PHP: обзор функций сортировки массивов
- Сортировка массива по ключу с usort php
- uasort и uksort: php сортировка массива по ключу с сохранением индексов
- array_multisort для php сортировка многомерного массива по полю
- Примеры кода: отсортировать массив по значению ‘price’ в ассоциативном массиве php
- Сравнение методов сортировки массива
- Частые ошибки и советы по php массив и сортировке
- Источники
- Заключение
Как отсортировать массив в PHP: обзор функций сортировки массивов
Сортировка массива в PHP — это не про один трюк, а про выбор инструмента под задачу. У вас ассоциативный массив массивов, где нужно взять ключ ‘price’ и расставить элементы по убыванию. Стандартные sort или asort не подойдут: они не видят вложенные значения. Здесь рулят функции вроде usort, uasort или array_multisort.
Вот быстрая шпаргалка в таблице — что когда юзать:
| Функция | Сохраняет ключи? | Что сортирует? | Идеально для вашего случая? |
|---|---|---|---|
usort |
Нет | По значениям с компаратором | Да, для простого перетасовывания |
uasort |
Да | По значениям | Если индексы важны |
uksort |
Да | По ключам | Редко, для строковых ключей |
array_multisort |
Да | По колонкам | Для нескольких полей |
Согласно официальной документации PHP, все они меняют массив на месте. А с PHP 8 сортировка стабильная — одинаковые элементы не переставляются случайно. Почему это круто? Представьте: цены равны, и типы фруктов не меняются местами.
Но подождите, а если массив огромный? Эти функции O(n log n), как и положено. Готовы к коду?
Сортировка массива по ключу с usort php
usort php — король для вашей задачи. Она принимает массив и компаратор: анонимную функцию, которая сравнивает два элемента и возвращает -1, 0 или 1. Для убывания просто меняем местами: если $b['price'] больше $a['price'], то $b идет первым.
Вот базовый пример для вашего $inventory:
$inventory = array(
array("type"=>"fruit", "price"=>3.50),
array("type"=>"milk", "price"=>2.90),
array("type"=>"pork", "price"=>5.43),
);
usort($inventory, function($a, $b) {
return $b['price'] <=> $a['price']; // Убывание: большее сначала
});
print_r($inventory);
Результат? Точно ваш желаемый: pork сверху, milk снизу. Ключи сбрасываются на 0,1,2 — нумерация новая. А если без spaceship (<=>)? Старый стиль:
usort($inventory, function($a, $b) {
if ($a['price'] == $b['price']) return 0;
return $a['price'] < $b['price'] ? 1 : -1; // Убывание
});
На Stack Overflow народ хвалит этот подход за универсальность. Работает с числами, строками — добавьте SORT_NUMERIC флаг, если нужно.
uasort и uksort: php сортировка массива по ключу с сохранением индексов
А если ключи нужны? Допустим, ваш массив не нумерация, а ‘apple’, ‘banana’. Тогда uasort — брат usort, но ключи остаются.
$inventory = array(
'apple' => array("type"=>"fruit", "price"=>3.50),
'milk' => array("type"=>"milk", "price"=>2.90),
'pork' => array("type"=>"pork", "price"=>5.43),
);
uasort($inventory, function($a, $b) {
return $b['price'] <=> $a['price'];
});
Ключи ‘pork’, ‘apple’, ‘milk’ — на месте! uksort сортирует по самим ключам, но вам это редко надо. Как пишут в Skillbox, разница в сохранении структуры — критично для ассоциативного массива php.
Минус? Чуть медленнее usort, но на практике незаметно.
array_multisort для php сортировка многомерного массива по полю
Не фанат компараторов? array_multisort — как Excel: выдираете колонку, сортируете, лепите обратно. Идеально для php сортировка многомерного массива по полю.
$prices = array_column($inventory, 'price'); // [3.50, 2.90, 5.43]
array_multisort($prices, SORT_DESC, SORT_NUMERIC, $inventory);
SORT_DESC — убывание, SORT_NUMERIC — для чисел. Ключи сохраняются. Плюс: можно несколько колонок, типа сначала price, потом type.
Из OTUS — это хит для баз данных, когда данные из SQL приходят.
А если NULL в price? Добавьте обработку: $prices = array_map(fn($v) => $v ?? 0, $prices);.
Примеры кода: отсортировать массив по значению ‘price’ в ассоциативном массиве php
Давайте разберем ваш случай полностью. Исходник:
$inventory = [
["type"=>"fruit", "price"=>3.50],
["type"=>"milk", "price"=>2.90],
["type"=>"pork", "price"=>5.43],
];
usort (рекомендую):
usort($inventory, fn($a, $b) => $b['price'] <=> $a['price']);
uasort (с ключами):
// Сначала присвойте ключи, если их нет
uasort($inventory, fn($a, $b) => $b['price'] <=> $a['price']);
array_multisort:
$prices = array_column($inventory, 'price');
array_multisort($prices, SORT_DESC, $inventory);
Все дают pork-fruit-milk. Тестируйте в PHP playground — увидите.
Что если price — строка “5.43”? SORT_NUMERIC спасет.
Сравнение методов сортировки массива
Какой выбрать? Вот таблица по реальным сценариям:
| Метод | Скорость | Ключи | Несколько полей | Сложность кода |
|---|---|---|---|---|
| usort | Высокая | Нет | Да (компаратор) | Средняя |
| uasort | Высокая | Да | Да | Средняя |
| array_multisort | Средняя | Да | Да (легко) | Низкая |
usort выигрывает для вашего случая — просто и быстро. На больших массивах (тысячи элементов) разница в миллисекундах.
Частые ошибки и советы по php массив и сортировке
Бьетесь головой? Вот типичные косяки:
- Не числовые price:
$b['price'] - $a['price']сломается на строках. Юзайте<=>или(float)$b['price']. - usort меняет оригинал: Сделайте копию
$copy = $inventory; usort($copy, ...). - Отсутствующий ключ:
isset($a['price']) ? $a['price'] : 0. - PHP <7: Без стрелочной
fn()— полнаяfunction($a,$b){...}.
Совет: всегда print_r после. И для стабильности — PHP 8+. А если массив из БД? array_column + multisort — огонь.
Но seriously, тестируйте на edge-кейсах: пустой массив, один элемент, NaN в price.
Источники
- PHP.net — Официальный справочник по функциям сортировки массивов в PHP: https://www.php.net/manual/ru/array.sorting.php
- Stack Overflow на русском — Обсуждение сортировки массива по значению с примерами usort: https://ru.stackoverflow.com/questions/138791/Сортировка-массива-по-значению
- Skillbox — Подробная инструкция по 13 способам сортировки массива в PHP: https://skillbox.ru/media/code/kak-otsortirovat-massiv-v-php-trinadtsatyu-sposobami-instruktsiya-s-primerami/
- OTUS — Руководство по сортировке массивов на PHP с кодом и скриншотами: https://otus.ru/journal/sortirovka-massiva-na-php/
Заключение
Для сортировки массива ассоциативных массивов по ‘price’ в убывающем порядке хватит usort — два строчки кода, и $inventory готов. Если ключи критичны, берите uasort или array_multisort. Главное — компаратор правильно, с учетом типов данных. Попробуйте на своем коде, и php сортировка массива перестанет быть головняком. Удачи в проекте!
В PHP для сортировки массива по значению ключа используйте usort(), uasort() или uksort() с пользовательской функцией сравнения. Функция usort сортирует по значениям без сохранения ключей, uasort сохраняет ключи при сортировке массива по ключу. Для убывающего порядка верните отрицательное значение, если $a['price'] > $b['price']. Все функции модифицируют массив на месте. Используйте флаги SORT_NUMERIC для числовых значений вроде price.
$inventory = array(
array("type"=>"fruit", "price"=>3.50),
array("type"=>"milk", "price"=>2.90),
array("type"=>"pork", "price"=>5.43),
);
usort($inventory, function($a, $b) {
return $b['price'] <=> $a['price'];
});
// Результат: pork (5.43), fruit (3.50), milk (2.90)
С PHP 8.0 сортировка стабильная.
Для php сортировка массива по ключу ‘price’ в убывающем порядке примените usort с компаратором: usort($array, function($a, $b){ return $b['price'] - $a['price']; }). uasort сохраняет ключи ассоциативного массива php. Альтернатива: извлеките цены в отдельный массив, отсортируйте arsort, затем перестройте. Обеспечьте числовой тип для price (SORT_NUMERIC). Для старых PHP используйте create_function.
uasort($inventory, function($a, $b) {
return $b['price'] <=> $a['price'];
});
Это решение подходит для сортировки многомерного массива по полю.
Отсортировать массив по значению ‘price’ в убывающем порядке**: usort(a, $b) { return $b[‘price’] <=> a['price']; });** или **array_multisort(array_column(inventory, ‘price’), SORT_DESC, $inventory);. Это работает для php сортировка многомерного массива по полю. Функции различаются по сохранению ключей: usort сбрасывает, uasort сохраняет. Добавьте SORT_NUMERIC для чисел. Подходит для ассоциативного массива php.
array_multisort(array_column($inventory, 'price'), SORT_DESC, SORT_NUMERIC, $inventory);
Для сортировки массива ассоциативных массивов по ‘price’ убыванию: usort(a, b) { return (a[‘price’] < $b[‘price’]) ? 1 : -1; });. Сохраните копию массива, так как usort изменяет оригинал. array_multisort подходит для php сортировка массива по ключу с несколькими полями. Другие варианты: asort/arsort для простых случаев, но usort универсален для отсортировать массив по значению в многомерном php массиве.
