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

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

Функция asort в PHP выполняет сортировку ассоциативного массива по возрастанию значений с сохранением связи ключей и значений. Она используется, когда требуется упорядочить данные по значению, но при этом важно сохранить ассоциацию ключей.

Синтаксис функции: asort(array &$array, int $flags = SORT_REGULAR): bool

Параметры:

  • $array – входной ассоциативный массив, передаваемый по ссылке. После выполнения функции массив будет отсортирован.
  • $flags – необязательный параметр, определяющий поведение сортировки. Возможные значения:
    • SORT_REGULAR – обычное сравнение элементов (типы не преобразуются)
    • SORT_NUMERIC – числовое сравнение
    • SORT_STRING – строковое сравнение
    • SORT_LOCALE_STRING – строковое сравнение с учетом локали
    • SORT_NATURAL – естественная сортировка строк
    • SORT_FLAG_CASE – комбинация с SORT_STRING или SORT_NATURAL для регистронезависимой сортировки

Возвращаемое значение: функция возвращает true в случае успешного выполнения и false в случае ошибки.

Примеры использования asort
Базовый пример
$fruits = ["d" => "lemon", "a" => "orange", "b" => "banana", "c" => "apple"];
asort($fruits);
print_r($fruits);
Array
(
    [c] => apple
    [b] => banana
    [d] => lemon
    [a] => orange
)
Сортировка чисел
$numbers = ["first" => 5, "second" => 2, "third" => 8, "fourth" => 1];
asort($numbers, SORT_NUMERIC);
print_r($numbers);
Array
(
    [fourth] => 1
    [second] => 2
    [first] => 5
    [third] => 8
)
Естественная сортировка строк
$files = ["img1.png", "img10.png", "img12.png", "img2.png"];
asort($files, SORT_NATURAL);
print_r($files);
Array
(
    [0] => img1.png
    [3] => img2.png
    [1] => img10.png
    [2] => img12.png
)
Похожие функции в PHP

В PHP существует несколько функций для сортировки массивов:

  • arsort() – сортировка ассоциативного массива по убыванию значений с сохранением ключей
  • ksort() – сортировка массива по ключам по возрастанию
  • krsort() – сортировка массива по ключам по убыванию
  • sort() – сортировка массива по значениям по возрастанию без сохранения ключей
  • usort() – сортировка массива с использованием пользовательской функции сравнения

Выбор функции зависит от задачи: asort применяется при необходимости сохранить ключи и отсортировать по значениям, sort – когда ключи не важны, ksort – когда требуется сортировка по ключам.

Типичные ошибки
Передача не ассоциативного массива
$array = [1, 3, 2];
$result = asort($array);
var_dump($array);
array(3) {
  [0]=> int(1)
  [2]=> int(2)
  [1]=> int(3)
}

Функция работает, но для индексированных массивов обычно используют sort().

Неправильная обработка возвращаемого значения
$array = ["a" => 1, "b" => 2];
if (asort($array)) {
    echo "Сортировка успешна";
} else {
    echo "Ошибка сортировки";
}
Сортировка успешна

Ошибкой считается только ситуация, когда параметр не является массивом.

Изменения в последних версиях PHP

В PHP 8.0 функция asort всегда возвращает true. В предыдущих версиях возвращалось true при успехе и false при ошибке, но с PHP 8.0 в случае невалидного параметра будет выброшена ошибка TypeError.

// PHP 7
$result = asort("not_array"); // Возвращает false

// PHP 8
$result = asort("not_array"); // TypeError: asort(): Argument #1 must be of type array
Расширенные примеры
Сортировка многомерного массива
Пример php
$users = [
    ["name" => "John", "age" => 30],
    ["name" => "Alice", "age" => 25],
    ["name" => "Bob", "age" => 35]
];
usort($users, function($a, $b) {
    return $a["age"] <=> $b["age"];
});
print_r($users);
Array
(
    [0] => Array
        (
            [name] => Alice
            [age] => 25
        )
    [1] => Array
        (
            [name] => John
            [age] => 30
        )
    [2] => Array
        (
            [name] => Bob
            [age] => 35
        )
)
Сортировка с учетом локали
Пример php
setlocale(LC_COLLATE, 'ru_RU.UTF-8');
$words = ["яблоко", "Абрикос", "банан", "Боб"];
asort($words, SORT_LOCALE_STRING | SORT_FLAG_CASE);
print_r($words);
Array
(
    [1] => Абрикос
    [3] => Боб
    [2] => банан
    [0] => яблоко
)
Комбинированная сортировка
Пример php
$data = [
    'item_10' => 42,
    'item_1' => 42,
    'item_5' => 17,
    'item_2' => 17
];

// Сначала сортируем по значениям, затем по ключам
asort($data);
ksort($data);
print_r($data);
Array
(
    [item_2] => 17
    [item_5] => 17
    [item_1] => 42
    [item_10] => 42
)
Аналоги функции в других языках

Asort в Python

В Python для сортировки словаря по значениям используется функция sorted() с параметром key:

fruits = {"d": "lemon", "a": "orange", "b": "banana", "c": "apple"}
sorted_fruits = dict(sorted(fruits.items(), key=lambda item: item[1]))
print(sorted_fruits)
{'c': 'apple', 'b': 'banana', 'd': 'lemon', 'a': 'orange'}

Asort в Javascript

В JavaScript объекты не гарантируют порядок свойств, но можно создать отсортированный массив пар ключ-значение:

const fruits = {d: 'lemon', a: 'orange', b: 'banana', c: 'apple'};
const sorted = Object.fromEntries(
  Object.entries(fruits).sort(([,a], [,b]) => a.localeCompare(b))
);
console.log(sorted);
{c: 'apple', b: 'banana', d: 'lemon', a: 'orange'}

Asort в MySQL

В MySQL сортировка происходит в запросе ORDER BY, но это применяется к результатам запроса, а не к структурам данных:

SELECT key_column, value_column FROM table ORDER BY value_column;

PHP asort function comments

En
Asort Sort an array in ascending order and maintain index association