14

Сортировка двумерного массива по значению в столбце

17

Как можно отсортировать этот массив по значению ключа "order"?

Несмотря на то, что значения в данный момент последовательные, в будущем они могут быть произвольными.

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
    )

)

5 ответ(ов)

3

Функция aasort предназначена для сортировки многомерного массива по определенному ключу (в данном случае по ключу "order"). Вот ее перевод и объяснение на русский язык в стиле ответа на StackOverflow:

function aasort (&$array, $key) {
    $sorter = array();
    $ret = array();
    reset($array);
    foreach ($array as $ii => $va) {
        $sorter[$ii] = $va[$key]; // Извлекаем значение по заданному ключу
    }
    asort($sorter); // Сортируем массив $sorter
    foreach ($sorter as $ii => $va) {
        $ret[$ii] = $array[$ii]; // Формируем отсортированный массив
    }
    $array = $ret; // Возвращаем отсортированный массив в исходный
}

aasort($your_array, "order"); // Вызов функции сортировки

Описание работы функции

  1. Получение значений: Сначала создается массив $sorter, куда помещаются значения из исходного массива $array, соответствующие ключу $key.

  2. Сортировка: Затем массив $sorter сортируется с помощью asort(), который сохраняет ассоциации ключей, то есть порядок ключей сохранится в сортированном массиве.

  3. Формирование нового массива: После сортировки создается новый массив $ret, в который на основе отсортированного массива $sorter добавляются соответствующие элементы из исходного массива $array.

  4. Обновление исходного массива: В конце, исходный массив $array обновляется и теперь содержит отсортированные значения.

Пример использования

Вызвав aasort($your_array, "order"), вы отсортируете $your_array по значению ключа "order". Убедитесь, что каждый элемент массива имеет ключ "order", иначе может возникнуть ошибка.

3

Я использую следующую функцию:

function array_sort_by_column(&$arr, $col, $dir = SORT_ASC) {
    $sort_col = array();
    foreach ($arr as $key => $row) {
        $sort_col[$key] = $row[$col];
    }

    array_multisort($sort_col, $dir, $arr);
}

array_sort_by_column($array, 'order');

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

Функция работает благодаря тому, что array_multisort() может сортировать несколько массивов. Пример входных данных:

Array
(
    [0] => Array
        (
            [hashtag] => a7e87329b5eab8578f4f1098a152d6f4
            [title] => Цветок
            [order] => 3
        )

    [1] => Array
        (
            [hashtag] => b24ce0cd392a5b0b8dedc66c25213594
            [title] => Бесплатно
            [order] => 2
        )
)

Сначала создается массив $sort_col, который является двухмерным массивом, где значения - это то, по чему мы хотим сортировать, а ключи соответствуют входному массиву. Например, для этих данных, выбирая ключ $sort_col "order", мы получаем:

Array
(
    [0] => 3,
    [1] => 2
)

Затем array_multisort() сортирует этот массив (в результате получаем порядок ключей 1, 0), но это только двухмерный массив. Исходный входной массив также передается в качестве аргумента $rest. Поскольку ключи совпадают, исходный массив также сортируется так, чтобы его ключи также находились в том же порядке, что и требуется.

Обратите внимание:

  • Массив передается по ссылке, чтобы переданный массив изменялся на месте.
  • array_multisort() может сортировать несколько дополнительных массивов таким образом, а не только один.
0

Чтобы отсортировать массив по значению ключа "title", используйте следующий код:

uasort($myArray, function($a, $b) {
    return strcmp($a['title'], $b['title']);
});

Функция strcmp сравнивает строки.

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

0

Конечно! Вот перевод вашего кода и пояснения на русский стиль, как на StackOverflow:

Чтобы отсортировать массив с учетом регистра (то есть как заглавные, так и строчные буквы), вы можете использовать следующий код на PHP:

$sort = array();
$array_lowercase = array_map('strtolower', $array_to_be_sorted);
array_multisort($array_lowercase, SORT_ASC, SORT_STRING, $alphabetically_ordered_array);

В этом коде мы сначала создаем новый массив $array_lowercase, где все строки из исходного массива $array_to_be_sorted преобразуются в нижний регистр с помощью функции array_map и strtolower. Затем с помощью array_multisort мы сортируем массив $array_lowercase в алфавитном порядке. Это позволяет вам избавиться от различий между верхним и нижним регистром при сортировке, в результате чего массив $alphabetically_ordered_array будет упорядочен корректно, учитывая как строчные, так и заглавные буквы.

Таким образом, данный подход эффективно обрабатывает как заглавные, так и строчные буквы.

0

Как указано в принятом ответе, вы можете использовать следующий код для сортировки:

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

Если вам нужно сортировать по нескольким столбцам, то сделайте так:

usort($myArray, function($a, $b) {
    return [$a['column1'],$a['column2']] <=> [$b['column1'],$b['column2']];
});

Этот метод можно расширять на любое количество столбцов в ваших данных. Это основано на том факте, что вы можете напрямую сравнивать массивы в PHP. В данном примере массив будет сначала отсортирован по column1, а затем по column2. Вы можете также сортировать столбцы в любом порядке. Например:

usort($myArray, function($a, $b) {
    return [$a['column2'],$a['column1']] <=> [$b['column2'],$b['column1']];
});

Если вам нужно отсортировать один столбец по возрастанию, а другой - по убыванию, просто поменяйте местами убывающий столбец с другой стороны оператора <=>:

usort($myArray, function($a, $b) {
    return [$a['column1'],$b['column2']] <=> [$b['column1'],$a['column2']];
});
Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь