сортировка многомерных массивов php
Сортировка массивов в php: ksort, asort и прочие sort’ы
Поговорим о сортировке массивов.
Более подробную информацию и примеры вы всегда можете найти в документации по функциям сортировки.
Допустим у нас есть массив
Он неправильно отсортирован, как видите ключи (1,2,3) и значения (виноград, арбуз, банан) идут не по порядку. Давайте это исправим:
Сортировка массива по ключу
Сортировка массива по значению
Свои способы сортировки
Если предложенные способы сортировки вам не подходят, то можно создать свой способ сортировки ключей и значений массивов. Для этого есть 3 функции uasort, uksort и usort. С их помощью мы можем задать свою callback функцию, которая будет сравнивать элементы между собой и определять какой из них «больше» и какой «меньше».
Давайте рассмотрим как они работают напримере функции uasort, которая сравнивает значения с сохранением ключей.
Применить нашу новую функцию можно так:
Сохранение ключей означает, что каждый ключ как бы привязан к своему значению.
Если сортировка не дает ожидаемый результат, то изучите флаги сортировки. По умолчанию используется обычный тип сортировки SORT_REGULAR
Флаги типа сортировки:
Флаг сортировки передается в функцию сортировки, например так:
Сортировка многомерных массивов
Создадим функцию, которая нам поможет в сортировке массивов
Пример работы этой функции array_orderby() :
Если вам нужно что-то совсем уж специфическое при сортировки многомерных массивов
Можете создать и другие callback функции сортировки самостоятельно.
Массивы на «стероидах»
Часто работаете с массивами? Тогда вам понравится это расширение для работы с коллекциями.
Рассмотрим несколько примеров.
Простая сортировка чисел:
Сортировка по одной «колонке» ассоциативного массива:
Сортировка по нескольким аттрибутам одновременно:
Вы также можете использовать свои функции сортировки при работе с коллекциями:
Коллекции позволяют работать с массивами как в Laravel и функции этого замечательного инструмента далеко не ограничиваются сортировкой.
Изучите документацию и вы влюбитесь в коллекции.
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
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)
>
>
Как сортировать массивы в PHP
Russian (Pусский) translation by Pembelight (you can also view the original English article)
Определенную информацию всегда легче получать из отсортированных данных, в обратном случае вам приходится пересматривать по очереди каждый элемент массива. Например, предположим, что вы храните оценки разных учеников одного класса в массиве или таблице. Если данные не отсортированы по оценкам, вам нужно пересмотреть оценку каждого учащегося, чтобы определить, кто получил самую высокую или или самую низкую. Если данные уже отсортированы от самой низкой к более высокой, то просто взглянув на оценку первого ученика, вы будете знать этот показатель.
Сортировка делает много простых и еффективных задач на основе доступа или получения определенного набора данных. В этом уроке мы узнаем, как использовать встроенные функции PHP для сортировки различных типов массивов.
Сортировка массива по значению
Вот несколько примеров, которые помогут вам быстро понять разницу между всеми типами сортировки.
В примере обычной сортировки числовые строки преобразуются в их числовые значения, и сортировка выполняется соответствующим образом. Строка «Apple» не является числовой, поэтому она остается нетронутой и сравнивается как строка.
Во втором примере наводится числовая сортировка, и мы хотим, чтобы данные сортировались по числовому значению, поэтому «Apple» преобразуется в числовое значение 0 и идет первым. Остальные значения отсортированы ожидаемым образом.
Сортировка ассоциативных массивов
Ассоциации ключевых значений важны, в случае если вы имеете дело с ассоциативными массивами. Рассмотрим следующий пример, где ассоциативный массив используется для хранения имен разных людей и их любимых фруктов. Если вы хотите отсортировать список в алфавитном порядке по названию фруктов, использование функции sort() из предыдущего раздела приведет к потере ассоциативных ключей.
Как видите, мы не только потеряли взаимосвязь между людьми и их любимыми фруктами, мы также потеряли имена этих людей. Каждому отсортированному значению был присвоен новый числовой индекс, основанный на его позиции в отсортированном массиве.
Сортировка элементов массива по значению с помощью пользовательских функций
С помощью разных значений вашим потребностям могут соответствовать четыре функции сортировки. Однако иногда ваши критерии сравнения элементов массива могут отличаться.
Допустим, у вас есть массив случайных слов, которые нужно отсортировать по алфавиту. Но перед этим вы ещё хотите их отсортировать по длине. Например, в традиционной алфавитной сортировке zoo будет следовать за apple. С другой стороны, если вы хотите показать сначала короткие слова, а потом длинные, то zoo появится перед apple. В том же наборе букв, ape будет перед zoo из-за алфавитного порядка.
В основном, слова сначала сортируются по длине, а затем слова с одинаковым количеством букв сортируются в алфавитном порядке в пределах своей группы. Этот тип сортировки не встроен в PHP, поэтому нам нужно написать собственную функцию.
Для таких случаев PHP предоставляет вам пару функций, которые можно использовать для передачи массива, подлежащий сортировке, вместе с именем вашей собственной функции сортировки.
Используйте функцию usort() для сортировки значений массива в обычных массивах. Точно так же можно использовать функцию uasort() для сортировки значений в ассоциативных массивах, сохраняя при этом ассоциаций ключевых значений.
Этот фрагмент кода показывает один из способов выполнения данной сортировки.
В функциях обратного вызова, предназначенных для пользовательской сортировки, мы должны вернуть целое число меньше 0, чтобы указать, что первое значение меньше второго. Если первое значение равно второму, возвращается 0. Если первое значение больше второго, возвращается целое число больше 0.
Как вы видите, в результате наша пользовательская функция сортировки переставляет слова в точности так, как мы хотели.
Сортировка массива по ключу
Вот основной пример сортировки:
В приведенном выше примере, чтобы отсортировать названия стран по длине их названия, а затем по алфавиту, мы использовали пользовательскую функцию сортировки из предыдущего раздела.
Сортировка многомерных массивов в PHP
В реальных проектах чаще всего имеют дело с многомерной информацией. Например, учебные заведения будут хранить оценки по разным предметам всех учащихся в одной таблице вместо создания новых таблиц для каждого предмета. Если вам понадобилось бы хранить похожую информацию в PHP, вы тоже предпочли использовать данный подход,а именно многомерный массив вместо отдельного массива для каждого предмета.
В этом уроке мы научимся сортировать многомерный массив, используя в качестве примера список самых высоких зданий в мире. Наш массив будет содержать информацию о здании: название, месторасположение (город, страна), количество этажей, общая высота в метрах, год постройки.
В конце мы просто перебираем основной массив и выводим информацию о каждом здании.