НейроАгент

Полное руководство: сортировка 2D-массивов по столбцу в PHP

Освойте сортировку массивов в PHP с нашим полным руководством. Узнайте, как сортировать 2D-массивы по значениям столбцов с помощью array_multisort() и array_column(). Включает примеры для всех сценариев сортировки.

Вопрос

Отсортировать 2D массив по значению столбца

Как можно отсортировать этот массив по значению ключа “order”? Хотя в данный момент значения идут последовательно, они не всегда будут такими.

php
Array
(
    [0] => Array
        (
            [hashtag] => a7e87329b5eab8578f4f1098a152d6f4
            [title] => Flower
            [order] => 3
        )

    [1] => Array
        (
            [hashtag] => b24ce0cd392a5b0b8dedc66c25213594
            [title] => Free
            [order] => 2
        )

    [2] => Array
        (
            [hashtag] => e7d31fc0602fb2ede144d18cdffd816b
            [title] => Ready
            [order] => 1
        )
)
НейроАгент

Вы можете сортировать двумерный массив по значению конкретного столбца с помощью функции PHP array_multisort() в сочетании с array_column(). Для вашего примера массива решение выглядит так:

php
array_multisort(array_column($yourArray, 'order'), SORT_ASC, $yourArray);

Это отсортирует массив в порядке возрастания на основе значений ключа “order”.


Содержание


Базовое решение для вашего примера

Для вашего конкретного массива, вот полная реализация:

php
<?php
// Ваш исходный массив
$items = [
    [
        'hashtag' => 'a7e87329b5eab8578f4f1098a152d6f4',
        'title' => 'Flower',
        'order' => 3
    ],
    [
        'hashtag' => 'b24ce0cd392a5b0b8dedc66c25213594',
        'title' => 'Free',
        'order' => 2
    ],
    [
        'hashtag' => 'e7d31fc0602fb2ede144d18cdffd816b',
        'title' => 'Ready',
        'order' => 1
    ]
];

// Сортировка по столбцу 'order' в порядке возрастания
array_multisort(array_column($items, 'order'), SORT_ASC, $items);

// Вывод отсортированного массива
print_r($items);
?>

Результат будет:

php
Array
(
    [0] => Array
        (
            [hashtag] => e7d31fc0602fb2ede144d18cdffd816b
            [title] => Ready
            [order] => 1
        )

    [1] => Array
        (
            [hashtag] => b24ce0cd392a5b0b8dedc66c25213594
            [title] => Free
            [order] => 2
        )

    [2] => Array
        (
            [hashtag] => a7e87329b5eab8578f4f1098a152d6f4
            [title] => Flower
            [order] => 3
        )
)

Понимание решения

Функция array_multisort() сортирует несколько массивов или многомерные массивы по столбцам. В сочетании с array_column() она становится мощным инструментом для сортировки двумерных массивов.

Как это работает:

  1. array_column($items, 'order') извлекает все значения из ключа “order” в один массив: [3, 2, 1]

  2. array_multisort() сортирует этот извлеченный массив, а затем применяет тот же порядок сортировки к исходному многомерному массиву

  3. SORT_ASC указывает порядок возрастания (также можно использовать SORT_DESC для убывания)


Сортировка в разных порядках

Порядок возрастания (по умолчанию)

php
array_multisort(array_column($items, 'order'), SORT_ASC, $items);

Порядок убывания

php
array_multisort(array_column($items, 'order'), SORT_DESC, $items);

Числовая сортировка (для числовых значений)

php
array_multisort(array_column($items, 'order'), SORT_NUMERIC, SORT_ASC, $items);

Строковая сортировка (для алфавитного порядка)

php
array_multisort(array_column($items, 'title'), SORT_STRING, SORT_ASC, $items);

Продвинутые техники сортировки

Сортировка по нескольким столбцам

Вы можете сортировать по нескольким столбцам для обработки одинаковых значений:

php
// Сортировка сначала по 'order', затем по 'title' для элементов с одинаковым order
array_multisort(
    array_column($items, 'order'), SORT_ASC,
    array_column($items, 'title'), SORT_ASC,
    $items
);

Пользовательская логика сортировки

Для более сложных требований к сортировке:

php
// Сортировка по order, но с пользовательским приоритетом для определенных значений
$sort = [];
foreach ($items as $k => $v) {
    $sort[$k] = $v['order'];
    // Добавьте пользовательскую логику при необходимости
}

array_multisort($sort, SORT_ASC, $items);

Альтернативные подходы

Использование usort() с пользовательской функцией

php
function sortByOrder($a, $b) {
    return $a['order'] <=> $b['order'];
}

usort($items, 'sortByOrder');

Использование array_uasort() для ассоциативных массивов

php
function sortByOrder($a, $b) {
    return $a['order'] <=> $b['order'];
}

array_uasort($items, 'sortByOrder');

Использование array_reduce() для сложной сортировки

php
$sorted = array_reduce($items, function($carry, $item) {
    $carry[$item['order']][] = $item;
    return $carry;
}, []);

// Затем "сплющите" массив в нужном порядке
$sorted = array_merge(...$sorted);

Рекомендации по производительности

Сравнение производительности

array_multisort() + array_column():

  • Плюсы: Самый быстрый для большинства случаев, встроенные функции, эффективно обрабатывает большие массивы
  • Минусы: Менее гибкий для сложной логики сортировки

usort():

  • Плюсы: Более гибкий, позволяет пользовательскую логику сравнения
  • Минусы: Медленнее для очень больших массивов, может быть сложнее в написании

Когда использовать каждый метод

  • Используйте array_multisort() для простой, быстрой сортировки по одному или нескольким столбцам
  • Используйте usort() когда вам нужна пользовательская логика сравнения
  • Используйте array_uasort() когда нужно сохранить связи с ключами

Полный рабочий пример

Вот полный, практический пример, который обрабатывает различные сценарии:

php
<?php
class ArraySorter {
    /**
     * Сортирует двумерный массив по конкретному столбцу
     * 
     * @param array $array Двумерный массив для сортировки
     * @param string $column Столбец для сортировки
     * @param string $order 'ASC' или 'DESC'
     * @param int $sortType SORT_REGULAR, SORT_NUMERIC или SORT_STRING
     * @return array Отсортированный массив
     */
    public static function sortByColumn($array, $column, $order = 'ASC', $sortType = SORT_REGULAR) {
        if (empty($array) || !is_array($array)) {
            return $array;
        }

        $columnValues = array_column($array, $column);
        
        $sortOrder = ($order === 'DESC') ? SORT_DESC : SORT_ASC;
        
        array_multisort($columnValues, $sortType, $sortOrder, $array);
        
        return $array;
    }

    /**
     * Сортировка по нескольким столбцам с разными порядками
     * 
     * @param array $array Двумерный массив для сортировки
     * @param array $columns Массив ['имя_столбца' => 'ASC/DESC']
     * @param int $sortType SORT_REGULAR, SORT_NUMERIC или SORT_STRING
     * @return array Отсортированный массив
     */
    public static function sortByMultipleColumns($array, $columns, $sortType = SORT_REGULAR) {
        if (empty($array) || !is_array($array) || empty($columns)) {
            return $array;
        }

        $sortArgs = [];
        foreach ($columns as $column => $order) {
            $sortArgs[] = array_column($array, $column);
            $sortArgs[] = ($order === 'DESC') ? SORT_DESC : SORT_ASC;
            $sortArgs[] = $sortType;
        }
        
        $sortArgs[] = &$array;
        
        call_user_func_array('array_multisort', $sortArgs);
        
        return $array;
    }
}

// Пример использования:
$items = [
    [
        'hashtag' => 'a7e87329b5eab8578f4f1098a152d6f4',
        'title' => 'Flower',
        'order' => 3
    ],
    [
        'hashtag' => 'b24ce0cd392a5b0b8dedc66c25213594',
        'title' => 'Free',
        'order' => 2
    ],
    [
        'hashtag' => 'e7d31fc0602fb2ede144d18cdffd816b',
        'title' => 'Ready',
        'order' => 1
    ],
    [
        'hashtag' => 'f1234567890abcdef1234567890abcdef',
        'title' => 'Apple',
        'order' => 1
    ]
];

// Сортировка по столбцу 'order' по возрастанию
$sortedByOrder = ArraySorter::sortByColumn($items, 'order', 'ASC');
echo "Отсортировано по order (ASC):\n";
print_r($sortedByOrder);

// Сортировка по столбцу 'order' по убыванию
$sortedByOrderDesc = ArraySorter::sortByColumn($items, 'order', 'DESC');
echo "\nОтсортировано по order (DESC):\n";
print_r($sortedByOrderDesc);

// Сортировка по нескольким столбцам: сначала по 'order' ASC, затем по 'title' ASC
$sortedMultiple = ArraySorter::sortByMultipleColumns($items, [
    'order' => 'ASC',
    'title' => 'ASC'
]);
echo "\nОтсортировано по нескольким столбцам:\n";
print_r($sortedMultiple);
?>

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


Источники

  1. PHP: array_multisort - Руководство - Официальная документация PHP, объясняющая функцию array_multisort
  2. php - Сортировка двумерного массива по значению столбца - Stack Overflow - Обсуждение сообщества с практическими примерами и однострочными решениями
  3. Как сортировать многомерный массив по значению ключа в PHP - CodexWorld - Учебник, показывающий комбинацию array_column и array_multisort
  4. Как сортировать многомерный массив по значению ключа в PHP? - GeeksforGeeks - Всеобъемлющее руководство с примерами
  5. php - Сортировка многомерного массива по конкретному ключу - Stack Overflow - Дополнительные примеры подходов и лучшие практики
  6. PHP array_multisort() Function - W3Schools - Дружелюбное объяснение для начинающих с примерами
  7. Как отсортировать многомерный массив по значению в PHP - Virendra’s TechTalk - Альтернативный подход с использованием функции usort

Заключение

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

  • Самый эффективный метод - array_multisort(array_column($array, 'column'), SORT_ASC, $array)
  • Для простых потребностей в сортировке этот однострочный подход быстр и прост в реализации
  • Для сложных требований к сортировке рассмотрите использование usort() с пользовательскими функциями сравнения
  • Сортировка по нескольким столбцам возможна путем цепочки дополнительных параметров в array_multisort()
  • Обработка ошибок должна быть реализована при работе с динамическими данными для предотвращения проблем с отсутствующими ключами

Предоставленное решение надежно работает с вашим примером массива и может обрабатывать различные типы данных и требования к сортировке. Для производственного кода рассмотрите возможность инкапсуляции логики в повторно используемую функцию или класс, как продемонстрировано в полном примере.