Обработка массивов в PHP: сортировка, фильтрация и пользовательские функции

Раздел: PHP -> Примеры

Основные методы сортировки массивов в PHP

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

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

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


$fruits = ['banana' => 3, 'apple' => 1, 'cherry' => 2];
asort($fruits);
print_r($fruits);
Array
(
    [apple] => 1
    [cherry] => 2
    [banana] => 3
)

Для сортировки по убыванию используйте arsort. Если требуется сортировка по ключам, применяются ksort и krsort.

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

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

Если ключи не важны, используйте sort для числовых массивов или rsort для обратного порядка. Это наиболее производительный способ для простых списков.


$numbers = [5, 2, 8, 1];
sort($numbers);
print_r($numbers);
Array
(
    [0] => 1
    [1] => 2
    [2] => 5
    [3] => 8
)

Ошибка: после sort массив всегда становится индексным (0,1,2...), даже если исходно был ассоциативным. Это приводит к неожиданному поведению при использовании строковых ключей.

Как выполнить сортировку по пользовательскому правилу?

Для нестандартной логики сравнения применяется usort (индексный массив) или uasort (ассоциативный с сохранением ключей). Функция сравнения должна возвращать отрицательное, нулевое или положительное значение.


$words = ['яблоко', 'Апельсин', 'банан', 'Груша'];
// Сортировка без учёта регистра
usort($words, function($a, $b) {
    return strcasecmp($a, $b);
});
print_r($words);
Array
(
    [0] => Апельсин
    [1] => банан
    [2] => Груша
    [3] => яблоко
)

Типичная ошибка: функция сравнения должна возвращать целое число, а не булево. Нельзя просто возвращать $a > $b, так как это даёт только true/false, а нужно три возможных значения.

Как отфильтровать массив по условию?

Функция array_filter позволяет оставить только те элементы, которые удовлетворяют заданному условию. По умолчанию удаляются пустые значения (false, null, 0, пустая строка).


$numbers = [1, 0, 2, null, 3, '', 4];
$filtered = array_filter($numbers);
print_r($filtered);
Array
(
    [0] => 1
    [2] => 2
    [4] => 3
    [6] => 4
)

Для произвольного условия передаётся callback-функция:


$numbers = [1, 2, 3, 4, 5, 6];
$even = array_filter($numbers, fn($v) => $v % 2 == 0);
print_r($even);
Array
(
    [1] => 2
    [3] => 4
    [5] => 6
)

Важно: array_filter сохраняет ключи исходного массива. Если нужно переиндексировать результат, используйте array_values.

Каждый из описанных методов подходит для определённых случаев: asort - для ассоциативных массивов с сохранением ключей, sort - для быстрой сортировки простых списков, usort - когда требуется нестандартная логика, array_filter - для удаления ненужных элементов.

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

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

Многоуровневая сортировка с помощью array_multisort

Функция array_multisort позволяет одновременно сортировать несколько массивов или многомерный массив по одному или нескольким критериям.

Пример

$names = ['Иван', 'Петр', 'Анна'];
$ages = [25, 20, 30];
// Сортируем по возрасту (первый массив), затем по имени (второй массив)
array_multisort($ages, SORT_ASC, $names, SORT_ASC);
print_r($names);
print_r($ages);
Array
(
    [0] => Петр
    [1] => Иван
    [2] => Анна
)
Array
(
    [0] => 20
    [1] => 25
    [2] => 30
)

Сортировка вложенных массивов по полю

Для массива объектов или вложенных массивов удобно использовать usort с доступом к полю.

Пример

$users = [
    ['name' => 'Иван', 'age' => 25],
    ['name' => 'Петр', 'age' => 20],
    ['name' => 'Анна', 'age' => 30],
];
usort($users, fn($a, $b) => $a['age'] - $b['age']);
print_r($users);
Array
(
    [0] => Array ( [name] => Петр [age] => 20 )
    [1] => Array ( [name] => Иван [age] => 25 )
    [2] => Array ( [name] => Анна [age] => 30 )
)

Фильтрация с сохранением ключей и переиндексацией

Использование array_values после фильтрации для получения последовательного индексного массива.

Пример

$data = ['a' => 10, 'b' => 0, 'c' => 20, 'd' => null];
$filtered = array_filter($data, fn($v) => $v !== null);
$indexed = array_values($filtered);
print_r($indexed);
Array
(
    [0] => 10
    [1] => 0
    [2] => 20
)

Сортировка строк с учётом локали

Для корректной сортировки в национальных алфавитах (например, с буквой Ё) используется setlocale и strcoll.

Пример

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

Объединение сортировки и фильтрации через array_filter и array_map

Пример: из массива чисел оставить только положительные, отсортировать по убыванию.

Пример

$numbers = [-3, 5, 0, 8, -1, 4];
$positive = array_filter($numbers, fn($v) => $v > 0);
rsort($positive);
print_r($positive);
Array
(
    [0] => 8
    [1] => 5
    [2] => 4
)

Пользовательская сортировка с учётом нескольких полей

Сортировка сначала по возрасту, затем по имени (если возраст одинаков).

Пример

$people = [
    ['name' => 'Иван', 'age' => 30],
    ['name' => 'Петр', 'age' => 25],
    ['name' => 'Анна', 'age' => 25],
];
usort($people, function($a, $b) {
    $cmp = $a['age'] - $b['age'];
    if ($cmp === 0) {
        return strcmp($a['name'], $b['name']);
    }
    return $cmp;
});
print_r($people);
Array
(
    [0] => Array ( [name] => Анна [age] => 25 )
    [1] => Array ( [name] => Петр [age] => 25 )
    [2] => Array ( [name] => Иван [age] => 30 )
)

Данные примеры охватывают типичные, но неочевидные ситуации, с которыми сталкиваются разработчики при работе с массивами в PHP.

Примеры кода PHP - comments

En
Php example (php)