Функции сортировки массивов в PHP

23-08-2010

В этом уроке рассмотрим способы быстрой сортировки массивов в PHP. Рассмотрим сортировку индексированных, ассоциативных и многомерных массивов используя некоторые полезные PHP функции.
Массивы очень полезны если вам нужно хранить и обрабатывать большие объемы данных. Очень часто нужно бывает сортировать массивы по определенным критериям. К счастью PHP предоставляет большое количество функций сортировки, массивы можно сортировать используя различный критерии. Например, вы можете сортировать в порядке возрастания или убывания, по ключу или по значению.
Я не собираюсь рассказывать о способах сортировки всех возможных массивов, расскажу только о тех которые вы вероятно посчитаете полезными для себя, и функциях которые вы часто будете использовать.
И так начнем!


Сортировка индексированных массивов: sort() и rsort()

sort() сортирует индексированный массив в порядке возрастания. Это означает что A стоит после Z. Но есть одна вещь о которой нужно помнить при использовании этой функции, функция назначает новые ключи для элементов array, все ранее установленные значения ключей будут утеряны то есть переназначены.
Возвращает true в случае удачной сортировки и false в случае возникновения ошибки. Пимер:

$myArray = array( 1, 2, 'a', 'b', 'A', 'B' );
sort( $myArray );

// Выведет "A B a b 1 2"
foreach ( $myArray as $val ) echo "$val ";

Как видно при сортировке заглавные буквы идут перед прописными.
rsort() работает точно также как и sort() за исключением того что он сортирует в порядке убывания:

$myArray = array( 1, 2, 'a', 'b', 'A', 'B' );
rsort( $myArray );

// Выведет "2 1 b a B A"
foreach ( $myArray as $val ) echo "$val ";


Сортировка ассоциативных массивов: asort() и arsort()

sort() и rsort() прекрасно подходят для индексированных массивов, где вы обычно не беспокоитесь о отношениях между ключами и значениями. Однако они могут привести к проблемам при работе с ассоциативными массивами. Рассмотрим следующий пример:

$movie = array( "title"    => "Rear Window",
                "director" => "Alfred Hitchcock",
                "year"     => 1954,
                "minutes"  => 112 );

sort( $movie );

// Выведет "Array ( [0] => Alfred Hitchcock [1] => Rear Window [2] => 112 [3] => 1954 )"
print_r($movie);

Как вы заметили, функция sort() переиндексировала массив на с числовыми индексами, уничтожив изначальные индексы title, director, year и minutes
Если вам нужно отсортировать значения в ассоциативном массиве, сохраняя ключи используйте asort() и arsort() вместо предыдущих двух функций. Эти функции сохраняют не только ключи, но и отношения между ключами и их значениями.
Для сортировки массива в порядке возрастания используйте asort():

$movie = array( "title"    => "Rear Window",
                "director" => "Alfred Hitchcock",
                "year"     => 1954,
                "minutes"  => 112 );

asort( $movie );

// Получим "Array ( [director] => Alfred Hitchcock [title] => Rear Window [minutes] => 112 [year] => 1954 )"
print_r( $movie );

arsort() сортирует массив в порядке убывания опять же с сохранением ключей:

$movie = array( "title"    => "Rear Window",
                "director" => "Alfred Hitchcock",
                "year"     => 1954,
                "minutes"  => 112 );

arsort( $movie );

// Получим "Array ( [year] => 1954 [minutes] => 112 [title] => Rear Window [director] => Alfred Hitchcock )"
print_r( $movie );


Сортировка ассоциативных массивов по ключу: ksort() и krsort()

Также как и сортировка ассоциативных массивов по значению, вы можете сортировать их по ключу. ksort() сортирует массив по возрастанию ключей конечно, а krsort() сортирует массив по убыванию. Также как и asort() и arsort(), эти функции сохраняют отношение ключ значение. Пару примеров:

$movie = array( "title"    => "Rear Window",
                "director" => "Alfred Hitchcock",
                "year"     => 1954,
                "minutes"  => 112 );

// Получим "Array ( [director] => Alfred Hitchcock [minutes] => 112 [title] => Rear Window [year] => 1954 )"
ksort( $movie );
print_r( $movie );

// Получим "Array ( [year] => 1954 [title] => Rear Window [minutes] => 112 [director] => Alfred Hitchcock )"
krsort( $movie );
print_r( $movie );


Сортировка многомерных или нескольких массивов сразу с помощью функции array_multisort()

Функция array_multisort() может быть использована для сортировки сразу нескольких массивов или одного многомерного массива в соответствии с одной или несколькими размерностями. Эта функция сохраняет соответствие между ключами и соответствующими им значениями

Сортировка нескольких массивов

Сортируя сразу несколько массивов, просто указываете эти массивы через запятую. Вообще структура аргументов этой функции немного необычна, но удобна. Первым аргументом должен быть массив. Последующие аргументы могут быть как массивами, так и значениями, определяющими порядок сортировки, приведенными в нижеследующем списке:

  • SORT_ASC сортировать в возрастающем порядке
  • SORT_DESC сортировать в убывающем порядке
  • SORT_REGULAR сравнивать элементы обычным образом
  • SORT_NUMERIC сравнивать элементы, как если бы они были числами
  • SORT_STRING сравнивать элементы, как если бы они были строками

Пример сортировки нескольких массивов:

$ar1 = array ("10", 100, 100, "a");
$ar2 = array (1, 3, "2", 1);
array_multisort ($ar1, $ar2);
//Первы массив будет содержать 10, "a", 100, 100
//а второй 1, 1, "2", 3


Сортировка многомерного массива

Пример:

$ar = array (array ("10", 100, 100, "a"), array (1, 3, "2", 1));
array_multisort ($ar[0], SORT_ASC, SORT_STRING,
                 $ar[1], SORT_NUMERIC, SORT_DESC);

В вышеприведенном примере, после сортировки, первый массив будет содержать 10, 100, 100, a (его элементы были отсортированы в возрастающем порядке так, как если бы они были строками), а второй массив будет содержать 1, 3, 2, 1 (элементы отсортированы как числа, в порядке убывания).

prada 財布4.19.2013 10:04
Renters ought to review their rental agreement carefully before signing this kind of document. The rental agreement is a legally binding document which needs to be given proper consideration before stepping into the agreement. This is important due to the fact understanding these terms are going to be essential if the should break the lease becomes a reality.
ОСТАВИТЬ КОММЕНТАРИЙ