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

Обратная сортировка массивов с помощью arsort
Раздел: Работа с массивами
arsort(array &$array, int $flags = SORT_REGULAR): bool
Описание функции arsort

Функция arsort выполняет обратную сортировку массива по убыванию значений с сохранением ассоциации ключей. Применяется при необходимости упорядочить элементы по значению, но с сохранением связи ключ-значение. Это полезно для ассоциативных массивов, где ключи имеют смысловую нагрузку.

Аргументы функции

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

  1. array &$array - обязательный параметр, передаваемый по ссылке. Представляет массив для сортировки.
  2. int $flags = SORT_REGULAR - необязательный параметр, определяющий алгоритм сравнения элементов:
    • SORT_REGULAR - обычное сравнение без преобразования типов.
    • SORT_NUMERIC - числовое сравнение.
    • SORT_STRING - строковое сравнение.
    • SORT_LOCALE_STRING - сравнение с учетом локали.
    • SORT_NATURAL - естественное упорядочение строк.
    • SORT_FLAG_CASE - комбинируется с SORT_STRING или SORT_NATURAL для регистронезависимой сортировки.
Примеры использования arsort
Базовый пример
$fruits = ["d" => "лимон", "a" => "апельсин", "b" => "банан", "c" => "яблоко"];
arsort($fruits);
print_r($fruits);
Array
(
    [c] => яблоко
    [a] => апельсин
    [d] => лимон
    [b] => банан
)
С флагом SORT_NUMERIC
$numbers = ["первый" => 10, "второй" => 2, "третий" => 35];
arsort($numbers, SORT_NUMERIC);
print_r($numbers);
Array
(
    [третий] => 35
    [первый] => 10
    [второй] => 2
)
С комбинированными флагами
$items = ["Item1", "item10", "item2", "ITEM5"];
arsort($items, SORT_NATURAL | SORT_FLAG_CASE);
print_r($items);
Array
(
    [1] => item10
    [3] => ITEM5
    [2] => item2
    [0] => Item1
)
Похожие функции в PHP
  • asort() - прямая сортировка по значению с сохранением ключей.
  • rsort() - обратная сортировка по значению без сохранения ключей.
  • krsort() - обратная сортировка по ключам.
  • usort() - сортировка с пользовательской функцией сравнения.

Выбор функции зависит от задачи: для сохранения ассоциаций ключей применяют arsort или asort, при необходимости сортировки по ключам - krsort или ksort.

Типичные ошибки
Передача не массива
$var = "строка";
arsort($var);
var_dump($var);
Warning: arsort() expects parameter 1 to be array, string given
Неправильное понимание сохранения ключей
$data = [100 => 'яблоко', 5 => 'груша'];
arsort($data);
print_r($data);
Array
(
    [100] => яблоко
    [5] => груша
)

Ключи сохраняются, но порядок элементов изменяется согласно значениям.

Изменения в PHP 8

В PHP 8.0 функция arsort стала использовать устойчивую сортировку. Это означает, что элементы с одинаковыми значениями сохраняют свой исходный относительный порядок. В предыдущих версиях порядок одинаковых элементов мог быть произвольным.

$array = ['a' => 5, 'b' => 5, 'c' => 3];
arsort($array);
print_r($array);
// PHP 8 и выше
Array
(
    [a] => 5
    [b] => 5
    [c] => 3
)
Расширенные примеры
Сортировка многомерного массива
Пример php
$users = [
    ['id' => 1, 'name' => 'Анна', 'score' => 85],
    ['id' => 2, 'name' => 'Иван', 'score' => 92],
    ['id' => 3, 'name' => 'Мария', 'score' => 78]
];

$scores = array_column($users, 'score', 'id');
arsort($scores);

foreach ($scores as $id => $score) {
    $key = array_search($id, array_column($users, 'id'));
    echo $users[$key]['name'] . ': ' . $score . "\n";
}
Иван: 92
Анна: 85
Мария: 78
Работа с локализацией
Пример php
setlocale(LC_COLLATE, 'ru_RU.UTF-8');
$words = ['яблоко', 'Абрикос', 'банан', 'Ананас'];
arsort($words, SORT_LOCALE_STRING);
print_r($words);
Array
(
    [0] => яблоко
    [2] => банан
    [1] => Абрикос
    [3] => Ананас
)
Сортировка объектов
Пример php
class Product {
    public function __construct(public string $name, public float $price) {}
}

$products = [
    'p1' => new Product('Стол', 1500),
    'p2' => new Product('Стул', 800),
    'p3' => new Product('Лампа', 1200)
];

$prices = [];
foreach ($products as $key => $product) {
    $prices[$key] = $product->price;
}
arsort($prices);
print_r($prices);
Array
(
    [p1] => 1500
    [p3] => 1200
    [p2] => 800
)
Аналоги в других языках

Arsort в Python

# Сортировка словаря по значениям
items = {'d': 'лимон', 'a': 'апельсин', 'b': 'банан'}
sorted_items = dict(sorted(items.items(), key=lambda x: x[1], reverse=True))
print(sorted_items)
{'a': 'апельсин', 'd': 'лимон', 'b': 'банан'}

Arsort в Javascript

// Преобразование объекта в массив пар, сортировка и сборка обратно
let items = {d: 'лимон', a: 'апельсин', b: 'банан'};
let sorted = Object.fromEntries(
    Object.entries(items).sort(([,a], [,b]) => b.localeCompare(a))
);
console.log(sorted);
{a: 'апельсин', d: 'лимон', b: 'банан'}

Arsort в MySQL

SELECT * FROM fruits ORDER BY name DESC;

В SQL сортировка происходит при выборке данных, ассоциативные связи не теряются.

PHP arsort function comments

En
Arsort Sort an array in descending order and maintain index association