Как правильно упорядочить данные в PHP: сортировка массивов

Раздел: Основы PHP -> Операции с массивами в PHP

Основные функции сортировки массивов в PHP

Сортировка массивов одна из частых операций. PHP предлагает несколько встроенных функций, каждая из которых подходит для определённых сценариев. Выбор зависит от типа массива (индексированный или ассоциативный), необходимости сохранять связи ключ-значение, направления сортировки и критериев упорядочивания.

Как отсортировать обычный индексированный массив по возрастанию значений с максимальной производительностью?

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


<?php
$fruits = [3, 1, 4, 1, 5, 9];
sort($fruits);
print_r($fruits);
?>

удалить пустые массивы php (удалить пустые массивы из массива в php)

Array
(
    [0] => 1
    [1] => 1
    [2] => 3
    [3] => 4
    [4] => 5
    [5] => 9
)

преобразовать массив в строку php (преобразовать массив в строку в php)

Проблема: После sort() ассоциативный массив теряет свои ключи - все ключи становятся числовыми от 0. Если нужно сохранить связь ключей и значений, используйте asort().

Как отсортировать массив по убыванию?

Функция rsort() работает аналогично sort(), но упорядочивает значения по убыванию. Ключи также переиндексируются.


<?php
$numbers = [10, 2, 8, 3];
rsort($numbers);
print_r($numbers);
?>

посчитать массив php (посчитать элементы массива в php)

Array
(
    [0] => 10
    [1] => 8
    [2] => 3
    [3] => 2
)

Php сравнить массивы (сравнить массивы в php)

Ошибка: Если массив ассоциативный, rsort() так же уничтожит ключи. Для ассоциативных массивов с сохранением ключей используйте arsort().

Как отсортировать ассоциативный массив по значениям, не теряя ключи?

asort() сортирует массив по значениям, оставляя ключи на своих местах. arsort() делает то же самое по убыванию.


<?php
$ages = ['Иван' => 25, 'Мария' => 30, 'Пётр' => 22];
asort($ages);
print_r($ages);
?>

Php отсортировать массив (отсортировать массив в php)

Array
(
    [Пётр] => 22
    [Иван] => 25
    [Мария] => 30
)

Php разбить строку на массив (разбить строку на массив в php)

Особенность: asort() может вести себя неожиданно при смешанных типах значений (числа + строки). Используйте флаг SORT_REGULAR для сравнения по умолчанию или SORT_NUMERIC / SORT_STRING для явного указания.

Как отсортировать массив по ключам (в алфавитном порядке)?

ksort() сортирует массив по ключам в порядке возрастания. krsort() - по убыванию. Ключи сохраняются вместе со своими значениями.


<?php
$capitals = ['Россия' => 'Москва', 'Франция' => 'Париж', 'Германия' => 'Берлин'];
ksort($capitals);
print_r($capitals);
?>

Php массив добавление (добавить элемент в массив в php)

Array
(
    [Германия] => Берлин
    [Россия] => Москва
    [Франция] => Париж
)

Php перебор массива (перебрать массив в php)

Проблема: Ключи могут быть числами, строками или смешанными. Сортировка строк с русскими буквами по умолчанию происходит по байтам (в кодировке UTF-8), что не всегда соответствует алфавитному порядку. Для корректной сортировки с учётом локали используйте setlocale() и strcoll().

Как задать произвольное правило сортировки (например, по длине строки)?

Функция usort() принимает пользовательскую функцию сравнения, которая должна возвращать -1, 0 или 1. Аналогично uasort() (сохраняет ключи) и uksort() (сортирует по ключам).


<?php
$words = ['кот', 'собака', 'дом', 'архитектура'];
usort($words, function($a, $b) {
    return strlen($a) - strlen($b);
});
print_r($words);
?>

наличие в массиве php (проверить наличие элемента в массиве в php)

Array
(
    [0] => кот
    [1] => дом
    [2] => собака
    [3] => архитектура
)

Php конец массива (получить последний элемент массива в php)

Ошибка: Функция сравнения должна быть транзитивной и последовательной. Неправильная реализация (например, использование <=> некорректно для нечисловых типов) может привести к неопределённому порядку или предупреждению. В PHP 7+ безопасно использовать spaceship оператор <=>.

Как отсортировать многомерный массив по одному из вложенных полей?

Используйте usort() в комбинации с array_column() или прямой доступ к элементам.


<?php
$people = [
    ['name' => 'Иван', 'age' => 30],
    ['name' => 'Мария', 'age' => 25],
    ['name' => 'Пётр', 'age' => 35]
];
usort($people, function($a, $b) {
    return $a['age'] - $b['age'];
});
print_r($people);
?>
Array
(
    [0] => Array ( [name] => Мария [age] => 25 )
    [1] => Array ( [name] => Иван [age] => 30 )
    [2] => Array ( [name] => Пётр [age] => 35 )
)

Проблема: Для второго уровня вложенности или использования ключей для сравнения (например, сортировка по значению ключа) usort может усложниться. Рассмотрите array_multisort() для сортировки по нескольким столбцам.

Как отсортировать несколько массивов одновременно (например, таблицу)?

array_multisort() сортирует несколько массивов одновременно, либо многомерный массив по одному или нескольким столбцам. Можно указывать направление сортировки и тип.


<?php
$names = ['Иван', 'Мария', 'Пётр'];
$ages  = [30, 25, 35];
array_multisort($ages, SORT_ASC, $names);
print_r($names);
print_r($ages);
?>
Array ( [0] => Мария [1] => Иван [2] => Пётр )
Array ( [0] => 25 [1] => 30 [2] => 35 )

Ошибка: array_multisort() изменяет переданные массивы по ссылке и требует, чтобы все массивы имели одинаковую длину. Несоответствие длины приведёт к предупреждению.

Расширенные примеры сортировки массивов в PHP

1. Сортировка массива объектов по свойству

Если массив состоит из объектов, usort() позволяет обращаться к публичным свойствам или методам.

Пример

<?php
class User {
    public $name;
    public $age;
    public function __construct($name, $age) {
        $this->name = $name;
        $this->age = $age;
    }
}
$users = [
    new User('Иван', 30),
    new User('Мария', 25),
    new User('Пётр', 35)
];
usort($users, function($a, $b) {
    return $a->age - $b->age;
});
foreach ($users as $u) echo $u->name . ' ' . $u->age . '\n';
?>
Мария 25
Иван 30
Пётр 35

2. Сортировка строк с учётом локали (русский алфавит)

По умолчанию PHP сравнивает строки по байтам. Для правильной сортировки русских слов задайте локаль с помощью setlocale() и используйте strcoll().

Пример

<?php
setlocale(LC_COLLATE, 'ru_RU.UTF-8');
$words = ['ёлка', 'ель', 'яблоко', 'арбуз'];
usort($words, 'strcoll');
print_r($words);
?>
Array
(
    [0] => арбуз
    [1] => ель
    [2] => ёлка
    [3] => яблоко
)

3. Использование флагов сортировки (SORT_NUMERIC, SORT_STRING, SORT_NATURAL)

В функциях sort, asort и др. второй параметр определяет способ сравнения. SORT_NATURAL + SORT_FLAG_CASE позволяет сортировать строки с числами естественным образом, как в проводнике.

Пример

<?php
$files = ['img2.jpg', 'img10.jpg', 'img1.jpg'];
sort($files, SORT_NATURAL | SORT_FLAG_CASE);
print_r($files);
?>
Array
(
    [0] => img1.jpg
    [1] => img2.jpg
    [2] => img10.jpg
)

Без флага SORT_NATURAL порядок был бы: img1, img10, img2 (лексикографически).

4. Сортировка многомерного массива по нескольким полям (array_multisort)

Допустим, таблица с именем, возрастом и зарплатой. Сортируем сначала по возрасту (по возрастанию), затем по зарплате (по убыванию).

Пример

<?php
$data = [
    ['name' => 'Иван', 'age' => 30, 'salary' => 50000],
    ['name' => 'Мария', 'age' => 25, 'salary' => 60000],
    ['name' => 'Пётр', 'age' => 30, 'salary' => 55000],
];
// Извлекаем отдельные столбцы
$ages = array_column($data, 'age');
$salaries = array_column($data, 'salary');
array_multisort($ages, SORT_ASC, $salaries, SORT_DESC, $data);
print_r($data);
?>
Array
(
    [0] => Array ( [name] => Мария [age] => 25 [salary] => 60000 )
    [1] => Array ( [name] => Пётр [age] => 30 [salary] => 55000 )
    [2] => Array ( [name] => Иван [age] => 30 [salary] => 50000 )
)

5. Сортировка с помощью spaceship оператора (комбинированное сравнение)

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

Пример

<?php
$people = [
    ['city' => 'Москва', 'name' => 'Иван'],
    ['city' => 'СПб', 'name' => 'Мария'],
    ['city' => 'Москва', 'name' => 'Пётр'],
];
usort($people, function($a, $b) {
    return $a['city'] <=> $b['city'] ?: $a['name'] <=> $b['name'];
});
print_r($people);
?>
Array
(
    [0] => Array ( [city] => Москва [name] => Иван )
    [1] => Array ( [city] => Москва [name] => Пётр )
    [2] => Array ( [city] => СПб [name] => Мария )
)

6. Сортировка массива станций метро по длине названия (обратный порядок)

Использование array_map и usort с предварительным вычислением.

Пример

<?php
$stations = ['Площадь Восстания', 'Невский проспект', 'Петроградская', 'Автово'];
$lengths = array_map('mb_strlen', $stations);
array_multisort($lengths, SORT_DESC, $stations);
print_r($stations);
?>
Array
(
    [0] => Площадь Восстания
    [1] => Невский проспект
    [2] => Петроградская
    [3] => Автово
)

Отсортировать массив в PHP - comments

En
Php отсортировать массив (php)