Сортировка двумерного массива по значению в столбце
Как можно отсортировать этот массив по значению ключа "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 ответ(ов)
Функция 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"); // Вызов функции сортировки
Описание работы функции
Получение значений: Сначала создается массив
$sorter
, куда помещаются значения из исходного массива$array
, соответствующие ключу$key
.Сортировка: Затем массив
$sorter
сортируется с помощьюasort()
, который сохраняет ассоциации ключей, то есть порядок ключей сохранится в сортированном массиве.Формирование нового массива: После сортировки создается новый массив
$ret
, в который на основе отсортированного массива$sorter
добавляются соответствующие элементы из исходного массива$array
.Обновление исходного массива: В конце, исходный массив
$array
обновляется и теперь содержит отсортированные значения.
Пример использования
Вызвав aasort($your_array, "order")
, вы отсортируете $your_array
по значению ключа "order". Убедитесь, что каждый элемент массива имеет ключ "order", иначе может возникнуть ошибка.
Я использую следующую функцию:
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()
может сортировать несколько дополнительных массивов таким образом, а не только один.
Чтобы отсортировать массив по значению ключа "title", используйте следующий код:
uasort($myArray, function($a, $b) {
return strcmp($a['title'], $b['title']);
});
Функция strcmp сравнивает строки.
Функция uasort() сохраняет индексы массива в том виде, в котором они были определены.
Конечно! Вот перевод вашего кода и пояснения на русский стиль, как на 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
будет упорядочен корректно, учитывая как строчные, так и заглавные буквы.
Таким образом, данный подход эффективно обрабатывает как заглавные, так и строчные буквы.
Как указано в принятом ответе, вы можете использовать следующий код для сортировки:
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']];
});
Сортировка массива объектов по значению строкового свойства
Сортировка массива объектов по значениям свойств
Как создать двумерный массив в JavaScript?
Преобразование объекта PHP в ассоциативный массив
Удалить пустые элементы массива