usort
Сортирует array по значениям, используя предоставленную пользователем функцию сравнения для определения порядка.
Замечание:
Если оба сравниваемых значения эквивалентны, они сохраняют свой первоначальный порядок. До PHP 8.0.0 их относительный порядок в отсортированном массиве не был определён.
Замечание: Эта функция присваивает новые ключи элементам array . Она удалит все существующие ключи, а не просто переупорядочит их.
Список параметров
Функция сравнения должна возвращать целое, которое меньше, равно или больше нуля, если первый аргумент является соответственно меньшим, равным или большим, чем второй.
Возвращение нецелых значений из функции сравнения, таких как число с плавающей точкой ( float ), приведёт к внутреннему приведению возвращаемого значения callback-функции к целому числу ( int ). Таким образом, значения 0.99 и 0.1 будут приведены к целочисленному значению 0 , что позволит сравнить эти значения как равные.
Возвращаемые значения
Функция всегда возвращает true .
Список изменений
Версия | Описание |
---|---|
8.2.0 | Тип возвращаемого значения теперь true ; ранее было bool . |
8.0.0 | Если параметр callback ожидает, что будет передано значение по ссылке, функция теперь выдаст ошибку уровня E_WARNING . |
Примеры
Пример #1 Пример использования usort()
foreach ( $a as $key => $value ) echo » $key : $value \n» ;
>
?>
Результат выполнения данного примера:
Для ещё большего упрощения внутреннего сравнения можно использовать оператор spaceship (космический корабль).
foreach ( $a as $key => $value ) echo » $key : $value \n» ;
>
?>
Замечание:
Очевидно, что для этого тривиального случая более подходит функция sort() .
Пример #2 Пример использования функции usort() с многомерными массивами
function cmp ( $a , $b )
return strcmp ( $a [ «fruit» ], $b [ «fruit» ]);
>
?php
$fruits [ 0 ][ «fruit» ] = «lemons» ;
$fruits [ 1 ][ «fruit» ] = «apples» ;
$fruits [ 2 ][ «fruit» ] = «grapes» ;
foreach ( $fruits as $key => $value ) echo «\$fruits[ $key ]: » . $value [ «fruit» ] . «\n» ;
>
?>
При сортировке многомерного массива переменные $a и $b содержат ссылки на первые два индекса массива.
Результат выполнения данного примера:
$fruits[0]: apples $fruits[1]: grapes $fruits[2]: lemons
Пример #3 Пример использования usort() с методом класса
class TestObj private string $name ;
?php
function __construct ( $name )
$this -> name = $name ;
>
/* This is the static comparing function: */
static function cmp_obj ( $a , $b )
return strtolower ( $a -> name ) strtolower ( $b -> name );
>
>
$a [] = new TestObj ( «c» );
$a [] = new TestObj ( «b» );
$a [] = new TestObj ( «d» );
usort ( $a , [ TestObj ::class, «cmp_obj» ]);
foreach ( $a as $item ) echo $item -> name . «\n» ;
>
?>
Результат выполнения данного примера:
Пример #4 Пример использования функции usort() с применением анонимной функции для сортировки многомерного массива
$array [ 0 ] = array( ‘key_a’ => ‘z’ , ‘key_b’ => ‘c’ );
$array [ 1 ] = array( ‘key_a’ => ‘x’ , ‘key_b’ => ‘b’ );
$array [ 2 ] = array( ‘key_a’ => ‘y’ , ‘key_b’ => ‘a’ );
?php
function build_sorter ( $key ) return function ( $a , $b ) use ( $key ) return strnatcmp ( $a [ $key ], $b [ $key ]);
>;
>
usort ( $array , build_sorter ( ‘key_b’ ));
foreach ( $array as $item ) echo $item [ ‘key_a’ ] . ‘, ‘ . $item [ ‘key_b’ ] . «\n» ;
>
?>
Результат выполнения данного примера:
Пример #5 Пример использования usort() с оператором spaceship (космический корабль)
Оператор spaceship (космический корабль) позволяет прямолинейно сравнивать составные значения по нескольким осям. В следующем примере $people сортируется по фамилии, а затем по имени, если фамилия совпадает.
$people [ 0 ] = [ ‘first’ => ‘Adam’ , ‘last’ => ‘West’ ];
$people [ 1 ] = [ ‘first’ => ‘Alec’ , ‘last’ => ‘Baldwin’ ];
$people [ 2 ] = [ ‘first’ => ‘Adam’ , ‘last’ => ‘Baldwin’ ];
?php
function sorter (array $a , array $b ) return [ $a [ ‘last’ ], $a [ ‘first’ ]] [ $b [ ‘last’ ], $b [ ‘first’ ]];
>
foreach ( $people as $person ) print $person [ ‘last’ ] . ‘, ‘ . $person [ ‘first’ ] . PHP_EOL ;
>
?>
Результат выполнения данного примера:
Baldwin, Adam Baldwin, Alec West, Adam
Смотрите также
- uasort() — Сортирует массив, используя пользовательскую функцию для сравнения элементов с сохранением ключей
- uksort() — Сортирует массив по ключам, используя пользовательскую функцию для сравнения ключей
- Сравнение функций сортировки массивов
User Contributed Notes 10 notes
As the documentation says, the comparison function needs to return an integer that is either «less than, equal to, or greater than zero». There is no requirement to restrict the value returned to -1, 0, 1.
usort ( $array , function( $a , $b ) if( $a -> integer_property > $b -> integer_property ) return 1 ;
>
elseif( $a -> integer_property < $b ->integer_property ) return — 1 ;
>
else return 0 ;
>
>);
?>
can be simplified to
usort ( $array , function( $a , $b ) return $a -> integer_property — $b -> integer_property ;
>);
?>
This of course applies to any comparison function that calculates an integer «score» for each of its arguments to decide which is «greater».
If you need to use usort with a key in the calling method, I wrote this as a utility:
function usort_comparison ( $obj , $method , $key ) $usorter = &new Usort ( $obj , $method , $key );
return array( $usorter , «sort» );
>
class Usort function __construct ( $obj , $method , $key ) $this -> obj = $obj ;
$this -> method = $method ;
$this -> key = $key ;
>
function sort ( $a , $b ) return call_user_func_array (array( $this -> obj , $this -> method ), array( $a , $b , $this -> key ));
>
>
class Foo $items = array( FooBar ( 13 ), FooBar ( 2 ));
public function sorter () usort ( $this — items , usort_comparison ( «Foo» , «_cmp» , «item» ));
>
public static function _cmp ( $a , $b , $key ) return strcasecmp ( $a -> $key , $b -> $key );
>
class FooBar public $item ;
function __construct ( $val ) $this -> item = $val ;
>
>
?>
~ simple example. but in the way I need to use it was the key was used in a switch statement to choose the different member of the object to compare against dynamically (as in, sort by x or y or z)
If you want to sort an array according to another array acting as a priority list, you can use this function.
function listcmp ( $a , $b )
<
global $order ;
foreach( $order as $key => $value )
<
if( $a == $value )
<
return 0 ;
break;
>
$order [ 0 ] = «first» ;
$order [ 1 ] = «second» ;
$order [ 2 ] = «third» ;
$array [ 0 ] = «second» ;
$array [ 1 ] = «first» ;
$array [ 2 ] = «third» ;
$array [ 3 ] = «fourth» ;
$array [ 4 ] = «second» ;
$array [ 5 ] = «first» ;
$array [ 6 ] = «second» ;
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() — Сортирует массив по значениям используя пользовательскую функцию для сравнения элементов
- Сравнение функций сортировки массивов