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

Использование функции sort для сортировки массивов в PHP
Раздел: Работа с массивами
sort(array &array [, int flags]): bool
Функция sort в PHP

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

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

array &$array - передаваемый по ссылке массив для сортировки. Изменяется непосредственно.

int $flags - необязательный параметр, определяющий тип сравнения элементов. Доступные константы:

  • SORT_REGULAR - обычное сравнение (по умолчанию)
  • SORT_NUMERIC - числовое сравнение
  • SORT_STRING - строковое сравнение
  • SORT_LOCALE_STRING - строковое сравнение с учетом локали
  • SORT_NATURAL - естественное упорядочивание
  • SORT_FLAG_CASE - может комбинироваться с SORT_STRING или SORT_NATURAL для регистронезависимой сортировки

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

Основные примеры использования
Простая сортировка числового массива
<?php
$numbers = [3, 1, 4, 1, 5, 9, 2];
sort($numbers);
print_r($numbers);
?>
Array
(
    [0] => 1
    [1] => 1
    [2] => 2
    [3] => 3
    [4] => 4
    [5] => 5
    [6] => 9
)
Сортировка строкового массива
<?php
$fruits = ["лимон", "апельсин", "банан", "яблоко"];
sort($fruits, SORT_STRING);
print_r($fruits);
?>
Array
(
    [0] => апельсин
    [1] => банан
    [2] => лимон
    [3] => яблоко
)
Естественная сортировка
<?php
$items = ["item1", "item10", "item2", "item20"];
sort($items, SORT_NATURAL);
print_r($items);
?>
Array
(
    [0] => item1
    [1] => item2
    [2] => item10
    [3] => item20
)
Сортировка с учетом локали
<?php
setlocale(LC_COLLATE, 'ru_RU.UTF-8');
$words = ["ёлка", "ель", "яблоко", "азбука"];
sort($words, SORT_LOCALE_STRING);
print_r($words);
?>
Array
(
    [0] => азбука
    [1] => ель
    [2] => ёлка
    [3] => яблоко
)
Похожие функции в PHP

Сохраняет ассоциацию ключ-значение при сортировке. Применяется для ассоциативных массивов.

Выполняет обратную сортировку массива по убыванию значений.

Производит сортировку с использованием пользовательской функции сравнения. Дает полный контроль над процессом сортировки.

Сортирует массив по ключам с сохранением ассоциации.

Реализует естественную сортировку с сохранением ключей.

Выбор функции

sort оптимальна для индексированных массивов без необходимости сохранять ключи. asort применяется для ассоциативных массивов. usort используется для сложных критериев сортировки. natsort подходит для строк, содержащих числа.

Распространенные ошибки
Сортировка ассоциативных массивов
<?php
$data = ["name" => "Иван", "age" => 25, "city" => "Москва"];
sort($data);
print_r($data);
?>
Array
(
    [0] => 25
    [1] => Москва
    [2] => Иван
)

После сортировки теряются ключи массива. Для сохранения ключей следует использовать asort.

Неверное сравнение разных типов данных
<?php
$mixed = [10, "5", 3, "12"];
sort($mixed, SORT_STRING);
print_r($mixed);
?>
Array
(
    [0] => 10
    [1] => 12
    [2] => 3
    [3] => 5
)

При строковой сортировке числа сравниваются как строки, что дает неожиданные результаты. Для числовой сортировки нужно использовать SORT_NUMERIC.

Попытка сортировки не массива
<?php
$string = "текст";
$result = sort($string);
var_dump($result);
?>
Warning: sort() expects parameter 1 to be array, string given
bool(false)

Функция работает только с массивами. Для других типов данных возникает предупреждение.

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

Изменен внутренний алгоритм сортировки. Теперь используется stable sorting (устойчивая сортировка), которая сохраняет относительный порядок равных элементов. Ранее порядок равных элементов мог меняться.

<?php
$data = [
    ['name' => 'Иван', 'age' => 25],
    ['name' => 'Петр', 'age' => 30],
    ['name' => 'Анна', 'age' => 25]
];

usort($data, function($a, $b) {
    return $a['age'] <=> $b['age'];
});

print_r($data);
?>

В PHP 8.0 и выше порядок записей с одинаковым возрастом (25 лет) сохраняется.

PHP 7.0

Добавлена поддержка константы SORT_FLAG_CASE, которая может комбинироваться с SORT_STRING или SORT_NATURAL для регистронезависимой сортировки.

Расширенные примеры
Сортировка многомерных массивов
Пример php
<?php
$users = [
    ['имя' => 'Мария', 'возраст' => 28],
    ['имя' => 'Алексей', 'возраст' => 22],
    ['имя' => 'Ольга', 'возраст' => 28],
    ['имя' => 'Иван', 'возраст' => 35]
];

// Создаем временный массив для сортировки
$ages = [];
foreach ($users as $key => $user) {
    $ages[$key] = $user['возраст'];
}

// Сортируем основной массив по временному
array_multisort($ages, SORT_ASC, $users);

print_r($users);
?>
Array
(
    [0] => Array
        (
            [имя] => Алексей
            [возраст] => 22
        )
    [1] => Array
        (
            [имя] => Мария
            [возраст] => 28
        )
    [2] => Array
        (
            [имя] => Ольга
            [возраст] => 28
        )
    [3] => Array
        (
            [имя] => Иван
            [возраст] => 35
        )
)
Сортировка с пользовательской логикой через usort
Пример php
<?php
$products = [
    ['name' => 'Ноутбук', 'price' => 50000, 'rating' => 4.5],
    ['name' => 'Телефон', 'price' => 30000, 'rating' => 4.7],
    ['name' => 'Планшет', 'price' => 25000, 'rating' => 4.3]
];

usort($products, function($a, $b) {
    // Сначала по рейтингу (убывание), потом по цене (возрастание)
    if ($b['rating'] != $a['rating']) {
        return $b['rating'] <=> $a['rating'];
    }
    return $a['price'] <=> $b['price'];
});

print_r($products);
?>
Array
(
    [0] => Array
        (
            [name] => Телефон
            [price] => 30000
            [rating] => 4.7
        )
    [1] => Array
        (
            [name] => Ноутбук
            [price] => 50000
            [rating] => 4.5
        )
    [2] => Array
        (
            [name] => Планшет
            [price] => 25000
            [rating] => 4.3
        )
)
Сортировка объектов
Пример php
<?php
class User {
    public function __construct(public string $name, public int $age) {}
}

$users = [
    new User('Ирина', 28),
    new User('Андрей', 22),
    new User('Сергей', 31)
];

usort($users, function($a, $b) {
    return $a->age <=> $b->age;
});

foreach ($users as $user) {
    echo $user->name . ': ' . $user->age . "\n";
}
?>
Андрей: 22
Ирина: 28
Сергей: 31
Регистронезависимая естественная сортировка
Пример php
<?php
$files = ["File10.txt", "file2.txt", "FILE1.txt", "file20.txt"];
sort($files, SORT_NATURAL | SORT_FLAG_CASE);
print_r($files);
?>
Array
(
    [0] => FILE1.txt
    [1] => file2.txt
    [2] => File10.txt
    [3] => file20.txt
)
Аналоги в других языках

Sort в Python

# Сортировка списка
numbers = [3, 1, 4, 1, 5]
numbers.sort()
print(numbers)  # [1, 1, 3, 4, 5]

# Создание нового отсортированного списка
sorted_numbers = sorted([3, 1, 4, 1, 5])
print(sorted_numbers)  # [1, 1, 3, 4, 5]

Python предлагает методы sort() для сортировки на месте и sorted() для создания новой отсортированной коллекции.

Sort в Javascript

// Сортировка массива
let numbers = [3, 1, 4, 1, 5, 9];
numbers.sort((a, b) => a - b);
console.log(numbers);  // [1, 1, 3, 4, 5, 9]

// Сортировка строк
let fruits = ["лимон", "апельсин", "банан"];
fruits.sort();
console.log(fruits);  // ["апельсин", "банан", "лимон"]

Метод sort() в JavaScript по умолчанию выполняет лексикографическую сортировку. Для числовой сортировки требуется функция сравнения.

Sort в MySQL

SELECT name, price FROM products
ORDER BY price ASC;

-- Сортировка по нескольким полям
SELECT name, category, price FROM products
ORDER BY category, price DESC;

В SQL сортировка осуществляется через оператор ORDER BY в запросах SELECT, что принципиально отличается от подхода PHP.

PHP sort function comments

En
Sort Sort an array in ascending order