Сортировка двумерного массива php
Сортировка двумерного массива на PHP
Не так давно передо мной встала задача сортировки двумерного массива на PHP, причём внутренний массив был ассоциативным. Я было хотел сортировать, как уже привык, методом пузырька, но потом решил поискать в Интернете более оригинальный способ и нашёл. И сейчас я с Вами поделюсь этим методом сортировки двумерного массива на PHP.
Давайте с Вами разберёмся в коде, в котором есть массив с несколькими пользователями, и нам необходимо отсортировать их по дате регистрации.
Вот таким простым способом можно отсортировать двумерный массив на PHP.
Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!
Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Порекомендуйте эту статью друзьям:
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
Комментарии ( 2 ):
Большое спасибо! Отличное решение
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.
Copyright © 2010-2021 Русаков Михаил Юрьевич. Все права защищены.
array_multisort — Сортирует несколько массивов или многомерные массивы
Описание
Функция array_multisort() может быть использована для сортировки сразу нескольких массивов или одного многомерного массива в соответствии с одной или несколькими размерностями.
Ассоциативные ( string ) ключи будут сохранены, но числовые ключи будут переиндексированы.
Список параметров
Настройки сортировки для вышеуказанного аргумента array :
Дополнительные массивы, необязательно следующие после порядка сортировки и флагов.
Возвращаемые значения
Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.
Список изменений
Примеры
Пример #1 Сортировка нескольких массивов
Пример #2 Сортировка многомерного массива
В вышеприведенном примере, после сортировки, первый массив будет содержать «10», 100, 100, 11, «a» (его элементы были отсортированы в возрастающем порядке), а второй массив будет содержать 1, 3, «2», 2, 1 (элементы отсортированы как числа, в порядке убывания).
Пример #3 Сортировка результатов из базы данных
В этом примере, каждый элемент массива data представляет собой ряд таблицы. Такой тип данных типичен для записей базы данных.
У нас есть массив строк, но array_multisort() необходим массив столбцов, поэтому сначала мы используем следующий код для получения столбцов, а потом выполним сортировку.
Теперь данные отсортированы и будут выглядеть вот так:
Пример #4 Сортировка без учета регистра
Обе константы SORT_STRING и SORT_REGULAR учитывают регистр при сортировке, строки, начинающиеся с заглавной буквы будут выставлены раньше строк, начинающихся со строчной буквы.
Для выполнения безрегистрового поиска нужно заставить выполнить порядок сортировки по копии оригинального массива, переведенного в нижний регистр.
Результат выполнения данного примера:
Смотрите также
Как отсортировать многомерный массив по значению в PHP
Мы можем использовать несколько разных методов для этого. Один из способов использования функции usort().
Используя мультисортный метод, мы можем легко отсортировать многомерный массив на основе его одного или нескольких значений. Давайте посмотрим, как мы можем использовать оба этих метода.
1.Сортировка с использованием usort.
Первый способ сортировки массива — использование функции usort(). Вот код, который мы можем использовать для выполнения этого вида:
Если вы хотите отсортировать массив на основе значений нескольких ключей, тогда вам, возможно, придется написать некоторую сложную логику в функции обратного вызова, чтобы сделать это. Однако существует альтернативный способ использования функции array_multisort(). Array_multisort() может использоваться для сортировки сразу нескольких массивов или многомерного массива одним или несколькими измерениями.
2.Сортировка с использованием array_multisort по значения 1-го ключа.
Теперь посмотрим как использовать функцию array_multisort() чтобы выполнить ту же сортировку, что мы использовали выше.
3.Сортировка с использованием array_multisort по значению 2-х ключей.
Теперь давайте посмотрим, как мы можем сортировать один и тот же массив с помощью значений 2-х ключей массива. В этом примере мы будем сортировать по значению по возрастанию, по убыванию имени.
4.Сортировка с использованием array_multisort по значению с 3-я ключами
Теперь давайте посмотрим, как мы можем сортировать один и тот же массив по 3-я ключами. В этом примере мы будем сортировать по убыванию, по убыванию и имени по возрастанию.
Чтобы не пропускать новые выпуски подписывайтесь на канал @world_hello_ru
Как сортировать многомерный массив в PHP [duplicate]
этот вопрос уже есть ответ здесь:
У меня есть данные CSV, загруженные в многомерный массив. Таким образом, каждая «строка» является записью, и каждый «столбец» содержит один и тот же тип данных. Я использую функцию ниже, чтобы загрузить мой CSV файл.
мне нужно указать столбец для сортировки, чтобы он переставлял строки. Один из столбцов содержит информацию о дате в формате Y-m-d H:i:s и я хотел бы быть в состоянии разобраться с самой последней датой первого ряда.
11 ответов
попробуйте что-то вроде этого:
для PHP >= 5.5.0 просто извлеките столбец для сортировки. Нет необходимости в цикле:
представляем: очень обобщенное решение для PHP 5.3+
я хотел бы добавить свое собственное решение здесь, так как он предлагает функции, которые другие ответы не делают.
в частности, преимущества этого решения включают в себя:
в код
как использовать
в этом разделе я буду предоставлять ссылки, которые сортируют этот набор данных образца:
основы
ключ также может быть числом, если элементы являются численно индексированными массивами. Для примера в вопросе это будет
несколько столбцов сортировки
дополнительные функции
дополнительные функции доступны, если вы укажете столбец сортировки в качестве массива вместо простой строки. Этот массив должен быть проиндексирован численно и содержать следующие элементы:
давайте посмотрим, как мы можем использовать эти особенности.
обратная сортировка
Сортировать по имени по убыванию:
Сортировать по номеру по убыванию, а затем по имени по убыванию:
пользовательские проекции
в некоторых сценариях может потребоваться Сортировать по столбцу, значения которого не поддаются сортировке. Дата рождения» столбец в наборе данных образца соответствует этому описанию: нет смысла сравнивать дни рождения как строки (например, «01/01/1980» предшествует «10/10/1970»). В этом случае мы хотим указать как проект фактические данные в форму, can сравнивается непосредственно с желаемой семантикой.
проекции могут быть указаны как любой тип вызвать: как строки, массивы, или анонимные функции. Проекция, как предполагается, примите один аргумент и верните его проецируемую форму.
давайте отсортируем набор данных примера без проекции и посмотрим, что произойдет:
это был не желаемый результат. Но мы можем использовать date_create как проекция:
это правильный порядок, который мы хотели.
есть еще много вещей, которые могут достичь проекции. Например, быстрый способ получить сортировку без учета регистра-использовать strtolower как проекция.
тем не менее, я также должен обратите внимание, что лучше не использовать проекции, если ваш набор данных большой: в этом случае было бы намного быстрее проецировать все ваши данные вручную, а затем сортировать без использования проекции, хотя это приведет к увеличению использования памяти для более быстрой скорости сортировки.
наконец, вот пример, который использует все функции: сначала сортирует по убыванию числа, затем по возрастанию дня рождения:
array_multisort
(PHP 4, PHP 5, PHP 7, PHP 8)
array_multisort — Сортирует несколько массивов или многомерные массивы
Описание
Функция array_multisort() может быть использована для сортировки сразу нескольких массивов или одного многомерного массива в соответствии с одной или несколькими размерностями.
Ассоциативные ( string ) ключи будут сохранены, но числовые ключи будут переиндексированы.
Если оба сравниваемых значения эквивалентны, они сохраняют свой первоначальный порядок. До PHP 8.0.0 их относительный порядок в отсортированном массиве не был определён.
Список параметров
Сортируемый массив ( array ).
Настройки сортировки для вышеуказанного аргумента array :
Дополнительные массивы, необязательно следующие после порядка сортировки и флагов. Сравниваются только элементы соответствующие таким же элементам в предыдущих массивах. Другими словами, производится сортировка в лексикографическом порядке.
Возвращаемые значения
Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.
Примеры
Пример #1 Сортировка нескольких массивов
Пример #2 Сортировка многомерного массива
В вышеприведённом примере, после сортировки, первый массив будет содержать «10», 100, 100, 11, «a» (его элементы были отсортированы в возрастающем порядке), а второй массив будет содержать 1, 3, «2», 2, 1 (элементы отсортированы как числа, в порядке убывания).
Пример #3 Сортировка результатов из базы данных
В этом примере, каждый элемент массива data представляет собой ряд таблицы. Такой тип данных типичен для записей базы данных.
У нас есть массив строк, но array_multisort() необходим массив столбцов, поэтому сначала мы используем следующий код для получения столбцов, а потом выполним сортировку.
Теперь данные отсортированы и будут выглядеть вот так:
Пример #4 Сортировка без учёта регистра
Обе константы SORT_STRING и SORT_REGULAR учитывают регистр при сортировке, строки, начинающиеся с заглавной буквы будут выставлены раньше строк, начинающихся со строчной буквы.
Для выполнения регистронезависимой сортировки, необходимо использовать копию исходного массива приведённую к нижнему регистру.
Результат выполнения данного примера:
Смотрите также
User Contributed Notes 39 notes
I came up with an easy way to sort database-style results. This does what example 3 does, except it takes care of creating those intermediate arrays for you before passing control on to array_multisort().
I would like to see the next code snippet to be added to http://nl3.php.net/array_multisort
Purpose: Sort a 2-dimensional array on some key(s)
Advantage of function:
— uses PHP’s array_multisort function for sorting;
— it prepares the arrays (needed by array_multisort) for you;
— allows the sort criteria be passed as a separate array (It is possible to use sort order and flags.);
— easy to set/overwrite the way strings are sorted (case insensitive instead of case sensitive, which is PHP’s default way of sorting);
— performs excellent
//Set the sort criteria (add as many fields as you want)
$sortCriteria =
array(‘field1’ => array(SORT_DESC, SORT_NUMERIC),
‘field3’ => array(SORT_DESC, SORT_NUMERIC)
);
A more inuitive way of sorting multidimensional arrays using array_msort() in just one line, you don’t have to divide the original array into per-column-arrays:
arr1 :
0 :
id : 1 (int)
name : aA ( string : 2 )
cat : cc ( string : 2 )
1 :
id : 2 (int)
name : aa ( string : 2 )
cat : dd ( string : 2 )
2 :
id : 3 (int)
name : bb ( string : 2 )
cat : cc ( string : 2 )
3 :
id : 4 (int)
name : bb ( string : 2 )
cat : dd ( string : 2 )
arr2 :
2 :
id : 3 (int)
name : bb ( string : 2 )
cat : cc ( string : 2 )
3 :
id : 4 (int)
name : bb ( string : 2 )
cat : dd ( string : 2 )
0 :
id : 1 (int)
name : aA ( string : 2 )
cat : cc ( string : 2 )
1 :
id : 2 (int)
name : aa ( string : 2 )
cat : dd ( string : 2 )
One-liner function to sort multidimensionnal array by key, thank’s to array_column
USort function can be used to sort multidimensional arrays with almost no work whatsoever by using the individual values within the custom sort function.
This function passes the entire child element even if it is not a string. If it is an array, as would be the case in multidimensional arrays, it will pass the whole child array as one parameter.
Therefore, do something elegant like this:
Easiest way I find out to sort an entire multidimensional array by one element of it:
This is the simpler version of the function by AlberT.
A lot of times you have got an array like this:
You just want to sort on the index in the second dimension, ie. on points in the above example.
You can use the function below and call it like this:
I had a function to make a sort on a 2D array and I wanted to sort an array using a column that usualy contains numeric values but also strings.
Lets say we have this array :
Array (
[0] => Array ( «name» = «12000» ),
[1] => Array ( «name» = «113» ),
[2] => Array ( «name» = «test 01» ),
[3] => Array ( «name» = «15000 tests» ),
[4] => Array ( «name» = «45» ),
[5] => Array ( «name» = «350» ),
[6] => Array ( «name» = «725» ),
[7] => Array ( «name» = «hello» )
>
SORT_STRING whould have returned me this :
Array ( // Numeric values are not correctly sorted
[0] => Array ( «name» = «113» ),
[1] => Array ( «name» = «12000» ),
[2] => Array ( «name» = «15000 tests» ),
[3] => Array ( «name» = «350» ),
[4] => Array ( «name» = «45» ),
[5] => Array ( «name» = «725» ),
[6] => Array ( «name» = «hello» ),
[7] => Array ( «name» = «test 01» )
>
SORT_NUMERIC would have returned me this :
Array ( // String values are not sorted, just in the same order
[0] => Array ( «name» = «test 01» ),
[1] => Array ( «name» = «hello» ),
[2] => Array ( «name» = «45» ),
[3] => Array ( «name» = «113» ),
[4] => Array ( «name» = «350» ),
[5] => Array ( «name» = «725» ),
[6] => Array ( «name» = «12000» ),
[7] => Array ( «name» = «15000 tests» ),
>
So I’ve made this hybrid code which combines the best of both worlds by merging content sorted either way according to the first caracter of the string:
Array (
[2] => Array ( «name» = «45» ),
[3] => Array ( «name» = «113» ),
[4] => Array ( «name» = «350» ),
[5] => Array ( «name» = «725» ),
[6] => Array ( «name» = «12000» ),
[7] => Array ( «name» = «15000 tests» ),
[1] => Array ( «name» = «hello» ),
[0] => Array ( «name» = «test 01» ),
>
A very simple way to sort an array of associative arrays by some value is to use usort.
I needed to sort an array of 20 data structures by their ‘distance’ value:
Array
(
[0] => Array
(
[blahblah] => blahblah
[distance] => 6
)
[1] => Array
(
you get the idea.
If you do not have PHP 5.4 installed yet and you cannot use SORT_NATURAL. This function sorts arrays natural multi-dimensional based on key value
this function can be used for arrays as
array ( name => array( key => value ) )
and
arrays as array( name => array( key => value), name => value) are not supported.
If this ‘trick’ gives a wrong order, you need a better key.
I was (as near everyone here 🙂 looking to sort 2-dimensional arrays by certain fields in the associative sub-arrays.
What I didn’t like about the documentation examples is that you need to loop through the input array to create sub arrays first, then use those in the function call.
«php a-t-the-r-a-t-e chir.ag» (http://www.php.net/manual/en/function.array-multisort.php#60401) wrote a quite cunning wrapper function, I rewrote it slightly, changing variable names and adding comments (for my sanity 🙂 mostly.
One snag I found: the input array is passed to array_multisort as last argument, but the changed array is not the one that is returned. Passing it by reference fixed that. This seems to be caused by the whole thing sitting inside the call_user_func_array, as shown below.
Often, one may have a group of arrays which have parallel data that need to be kept associated with each other (e.g., the various attribute values of a group of elements might be stored in their own arrays). Using array_multisort as is, by specifying additional fields, it is possible, as in the documentation example cited below, that this association will be lost.
In order to sort by one field only (yet still have the other array(s) being correspondingly sorted), one can use array_keys (which makes an array out of the keys) to ensure that no further sub-sorting is performed. This works because array_keys is making an array for which no duplicates can exist (since keys will be unique), and thus, the subsequent fields will have no relevance as far as subsorting.
For database like sorting, here is my 2 cents:
/**
* The RowsSortHelperTool class.
*/
class RowsSortHelperTool
<
?>
Will display something like this:
array(7) <
[0] => array(3) <
[«volume»] => int(98)
[«edition»] => int(2)
[«mine»] => int(5)
>
[1] => array(3) <
[«volume»] => int(86)
[«edition»] => int(1)
[«mine»] => int(5)
>
[2] => array(3) <
[«volume»] => int(86)
[«edition»] => int(6)
[«mine»] => int(5)
>
[3] => array(3) <
[«volume»] => int(86)
[«edition»] => int(6)
[«mine»] => int(4)
>
[4] => array(3) <
[«volume»] => int(85)
[«edition»] => int(6)
[«mine»] => int(5)
>
[5] => array(3) <
[«volume»] => int(67)
[«edition»] => int(2)
[«mine»] => int(5)
>
[6] => array(3) <
[«volume»] => int(67)
[«edition»] => int(7)
[«mine»] => int(5)
>
>