PHP Функция array_multisort()
Возврат отсортированного массива в порядке возрастания:
Определение и использование
Функция array_multisort() возвращает отсортированный массив. Вы можете назначить один или несколько массивов. Функция сортирует первый массив, а остальные массивы следуют за ним, затем, если два или более значения являются одинаковые, он сортирует следующий массив и так далее.
Примечание: Строковые ключи будут сохранены, но числовые ключи будут переиндексированы, начиная с 0 и увеличившись на 1.
Примечание: Вы можете назначить параметры порядок сортировки и тип сортировки после каждого массива. Если этот параметр не указан, каждый параметр массива использует значения по умолчанию.
Синтаксис
Параметр значений
- SORT_ASC — По умолчанию. Сортировка в порядке возрастания (А-Я)
- SORT_DESC — Сортировка в порядке убывания (Я-А)
- SORT_REGULAR — По умолчанию. Сравнение элементов в обычном режиме (Стандартный ASCII)
- SORT_NUMERIC — Сравнение элементов в виде числовых значений
- SORT_STRING — Сравнение элементов в виде строковых значений
- SORT_LOCALE_STRING — Сравнение элементов в виде строки на основе текущей локали (может быть изменено с помощью setlocale())
- SORT_NATURAL — Сравните элементы как строки, используя «естественный порядок», например natsort()
- SORT_FLAG_CASE — Может быть объединен (побитово или) с SORT_STRING или SORT_NATURAL для сортировки строк без учета регистра
Технические подробности
Возврат значения: | Возвращает TRUE в случае успеха или FALSE в случае неудачи |
---|---|
PHP Версия: | 4+ |
PHP Список изменений: | PHP 5.4: добавлен тип сортировки SORT_NATURAL и SORT_FLAG_CASE PHP 5.2: добавлен тип сортировки SORT_LOCALE_STRING |
Еще примеры
Пример
Возврат отсортированного массива в порядке возрастания:
Пример
Посмотрите, как он сортируется, когда два значения являются одинаковые:
Пример
Использование параметров сортировки:
Пример
Объедините два массива и отсортируйте их как числа в порядке убывания:
Мы только что запустили
SchoolsW3 видео
array_multisort
Функция array_multisort() может быть использована для сортировки сразу нескольких массивов или одного многомерного массива в соответствии с одной или несколькими размерностями.
Ассоциативные ( string ) ключи будут сохранены, но числовые ключи будут переиндексированы.
Список параметров
Порядок для сортировки вышеуказанного аргумента array . Или SORT_ASC для сортировки по возрастанию, или SORT_DESC для сортировки по убыванию.
Этот аргумент может меняться местами с array1_sort_flags или вообще быть пропущенным. В этом случае подразумевается значение SORT_ASC .
Настройки сортировки для вышеуказанного аргумента array :
- SORT_REGULAR — обычное сравнение элементов (без изменения типов)
- SORT_NUMERIC — сравнение элементов как чисел
- SORT_STRING — сравнение элементов как строк
- SORT_LOCALE_STRING — сравнение элементов как строк, учитывая текущую локаль. Используется локаль, которую можно менять с помощью функции setlocale()
- SORT_NATURAL — сравнение элементов как строк с использованием алгоритма «natural order», так же как в функции natsort()
- SORT_FLAG_CASE — может быть объединен (бинарное OR) с SORT_STRING или SORT_NATURAL для сортировки без учета регистра
Этот аргумент может меняться местами с array1_sort_order или вообще быть пропущенным. В этом случае подразумевается значение SORT_REGULAR .
Дополнительные массивы, необязательно следующие после порядка сортировки и флагов.
Возвращаемые значения
Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.
Список изменений
Версия | Описание |
---|---|
5.4.0 | Добавлены SORT_NATURAL и SORT_FLAG_CASE в возможные флаги сортировки array1_sort_flags . |
5.3.0 | Добавлен SORT_LOCALE_STRING в возможные флаги сортировки array1_sort_flags . |
Примеры
Пример #1 Сортировка нескольких массивов
$ar1 = array( 10 , 100 , 100 , 0 );
$ar2 = array( 1 , 3 , 2 , 4 );
array_multisort ( $ar1 , $ar2 );
?php
var_dump ( $ar1 );
var_dump ( $ar2 );
?>
В вышеприведенном примере, после того, как будет осуществлена сортировка, первый массив будет содержать 0, 10, 100, 100. Второй — 4, 1, 2, 3. Элементы второго массива, соответствующие идентичным элементам первого (100 и 100), также будут отсортированы.
array(4) < [0]=>int(0) [1]=> int(10) [2]=> int(100) [3]=> int(100) > array(4) < [0]=>int(4) [1]=> int(1) [2]=> int(2) [3]=> int(3) >
Пример #2 Сортировка многомерного массива
$ar = array(
array( «10» , 11 , 100 , 100 , «a» ),
array( 1 , 2 , «2» , 3 , 1 )
);
array_multisort ( $ar [ 0 ], SORT_ASC , SORT_STRING ,
$ar [ 1 ], SORT_NUMERIC , SORT_DESC );
var_dump ( $ar );
?>?php
В вышеприведенном примере, после сортировки, первый массив будет содержать «10», 100, 100, 11, «a» (его элементы были отсортированы в возрастающем порядке), а второй массив будет содержать 1, 3, «2», 2, 1 (элементы отсортированы как числа, в порядке убывания).
array(2) < [0]=>array(5) < [0]=>string(2) "10" [1]=> int(100) [2]=> int(100) [3]=> int(11) [4]=> string(1) "a" > [1]=> array(5) < [0]=>int(1) [1]=> int(3) [2]=> string(1) "2" [3]=> int(2) [4]=> int(1) > >
Пример #3 Сортировка результатов из базы данных
В этом примере, каждый элемент массива data представляет собой ряд таблицы. Такой тип данных типичен для записей базы данных.
# том | издание volume | edition -------+-------- 67 | 2 86 | 1 85 | 6 98 | 2 86 | 6 67 | 7
Данные представлены в виде массива с именем data . Обычно их можно получить, к пример, с помощью цикла из функции mysql_fetch_assoc() .
$data [] = array( ‘volume’ => 67 , ‘edition’ => 2 );
$data [] = array( ‘volume’ => 86 , ‘edition’ => 1 );
$data [] = array( ‘volume’ => 85 , ‘edition’ => 6 );
$data [] = array( ‘volume’ => 98 , ‘edition’ => 2 );
$data [] = array( ‘volume’ => 86 , ‘edition’ => 6 );
$data [] = array( ‘volume’ => 67 , ‘edition’ => 7 );
?>?php
В нашем примере мы будем сортировать по volume в убывающем порядке, а по edition — в возрастающем.
У нас есть массив строк, но array_multisort() необходим массив столбцов, поэтому сначала мы используем следующий код для получения столбцов, а потом выполним сортировку.
// Получение списка столбцов
foreach ( $data as $key => $row ) $volume [ $key ] = $row [ ‘volume’ ];
$edition [ $key ] = $row [ ‘edition’ ];
>
?php
// Сортируем данные по volume по убыванию и по edition по возрастанию
// Добавляем $data в качестве последнего параметра, для сортировки по общему ключу
array_multisort ( $volume , SORT_DESC , $edition , SORT_ASC , $data );
?>
Теперь данные отсортированы и будут выглядеть вот так:
volume | edition -------+-------- 98 | 2 86 | 1 86 | 6 85 | 6 67 | 2 67 | 7
Пример #4 Сортировка без учета регистра
Обе константы SORT_STRING и SORT_REGULAR учитывают регистр при сортировке, строки, начинающиеся с заглавной буквы будут выставлены раньше строк, начинающихся со строчной буквы.
Для выполнения безрегистрового поиска нужно заставить выполнить порядок сортировки по копии оригинального массива, переведенного в нижний регистр.
$array = array( ‘Alpha’ , ‘atomic’ , ‘Beta’ , ‘bank’ );
$array_lowercase = array_map ( ‘strtolower’ , $array );
?php
array_multisort ( $array_lowercase , SORT_ASC , SORT_STRING , $array );
Результат выполнения данного примера:
Array ( [0] => Alpha [1] => atomic [2] => bank [3] => Beta )
Смотрите также
- usort() — Сортирует массив по значениям используя пользовательскую функцию для сравнения элементов
- Сравнение функций сортировки массивов
array_multisort
array_multisort() can be used to sort several arrays at once, or a multi-dimensional array by one or more dimensions.
Associative ( string ) keys will be maintained, but numeric keys will be re-indexed.
Note:
If two members compare as equal, they retain their original order. Prior to PHP 8.0.0, their relative order in the sorted array was undefined.
Note:
Resets array’s internal pointer to the first element.
Parameters
The order used to sort the previous array argument. Either SORT_ASC to sort ascendingly or SORT_DESC to sort descendingly.
This argument can be swapped with array1_sort_flags or omitted entirely, in which case SORT_ASC is assumed.
Sort options for the previous array argument:
- SORT_REGULAR — compare items normally (don’t change types)
- SORT_NUMERIC — compare items numerically
- SORT_STRING — compare items as strings
- SORT_LOCALE_STRING — compare items as strings, based on the current locale. It uses the locale, which can be changed using setlocale()
- SORT_NATURAL — compare items as strings using «natural ordering» like natsort()
- SORT_FLAG_CASE — can be combined (bitwise OR) with SORT_STRING or SORT_NATURAL to sort strings case-insensitively
This argument can be swapped with array1_sort_order or omitted entirely, in which case SORT_REGULAR is assumed.
More arrays, optionally followed by sort order and flags. Only elements corresponding to equivalent elements in previous arrays are compared. In other words, the sort is lexicographical.
Return Values
Returns true on success or false on failure.
Examples
Example #1 Sorting multiple arrays
$ar1 = array( 10 , 100 , 100 , 0 );
$ar2 = array( 1 , 3 , 2 , 4 );
array_multisort ( $ar1 , $ar2 );
?php
var_dump ( $ar1 );
var_dump ( $ar2 );
?>
In this example, after sorting, the first array will contain 0, 10, 100, 100. The second array will contain 4, 1, 2, 3. The entries in the second array corresponding to the identical entries in the first array (100 and 100) were sorted as well.
array(4) < [0]=>int(0) [1]=> int(10) [2]=> int(100) [3]=> int(100) > array(4) < [0]=>int(4) [1]=> int(1) [2]=> int(2) [3]=> int(3) >
Example #2 Sorting multi-dimensional array
$ar = array(
array( «10» , 11 , 100 , 100 , «a» ),
array( 1 , 2 , «2» , 3 , 1 )
);
array_multisort ( $ar [ 0 ], SORT_ASC , SORT_STRING ,
$ar [ 1 ], SORT_NUMERIC , SORT_DESC );
var_dump ( $ar );
?>?php
In this example, after sorting, the first array will transform to «10», 100, 100, 11, «a» (it was sorted as strings in ascending order). The second will contain 1, 3, «2», 2, 1 (sorted as numbers, in descending order).
array(2) < [0]=>array(5) < [0]=>string(2) "10" [1]=> int(100) [2]=> int(100) [3]=> int(11) [4]=> string(1) "a" > [1]=> array(5) < [0]=>int(1) [1]=> int(3) [2]=> string(1) "2" [3]=> int(2) [4]=> int(1) > >
Example #3 Sorting database results
For this example, each element in the data array represents one row in a table. This type of dataset is typical of database records.
volume | edition -------+-------- 67 | 2 86 | 1 85 | 6 98 | 2 86 | 6 67 | 7
The data as an array, called data . This would usually, for example, be obtained by looping with mysqli_fetch_assoc() .
$data [] = array( ‘volume’ => 67 , ‘edition’ => 2 );
$data [] = array( ‘volume’ => 86 , ‘edition’ => 1 );
$data [] = array( ‘volume’ => 85 , ‘edition’ => 6 );
$data [] = array( ‘volume’ => 98 , ‘edition’ => 2 );
$data [] = array( ‘volume’ => 86 , ‘edition’ => 6 );
$data [] = array( ‘volume’ => 67 , ‘edition’ => 7 );
?>?php
In this example, we will order by volume descending, edition ascending.
We have an array of rows, but array_multisort() requires an array of columns, so we use the below code to obtain the columns, then perform the sorting.
// Obtain a list of columns
foreach ( $data as $key => $row ) $volume [ $key ] = $row [ ‘volume’ ];
$edition [ $key ] = $row [ ‘edition’ ];
>
?php
// you can use array_column() instead of the above code
$volume = array_column ( $data , ‘volume’ );
$edition = array_column ( $data , ‘edition’ );
// Sort the data with volume descending, edition ascending
// Add $data as the last parameter, to sort by the common key
array_multisort ( $volume , SORT_DESC , $edition , SORT_ASC , $data );
?>
The dataset is now sorted, and will look like this:
volume | edition -------+-------- 98 | 2 86 | 1 86 | 6 85 | 6 67 | 2 67 | 7
Example #4 Case insensitive sorting
Both SORT_STRING and SORT_REGULAR are case sensitive, strings starting with a capital letter will come before strings starting with a lowercase letter.
To perform a case insensitive sort, force the sorting order to be determined by a lowercase copy of the original array.
$array = array( ‘Alpha’ , ‘atomic’ , ‘Beta’ , ‘bank’ );
$array_lowercase = array_map ( ‘strtolower’ , $array );
?php
array_multisort ( $array_lowercase , SORT_ASC , SORT_STRING , $array );
The above example will output:
Array ( [0] => Alpha [1] => atomic [2] => bank [3] => Beta )