Сортировка массивов
В PHP есть несколько функций для сортировки массивов, на этой странице дается их общее описание.
Основные различия между функциями:
- В одних функциях массивы array сортируются по ключам элементов, в других по значениям: $array['ключ'] = 'значение';
- В каких-то функциях связь между ключами и значениями после сортировки сохраняется, в каких-то нет. Это может приводить к тому, что ключи будут сбрасываться в числовые значения (0, 1, 2, ...).
- Различия в порядке сортировки: алфавитный, возрастающий, убывающий, числовой, натуральный, случайный или определенный пользователем
- Примечание: Все функции сортировки модифицируют переданный массив, а не возвращают отсортированную копию
- Если функции определяют два элемента как равные, порядок сортировки в этом случае не определен (нестабильная сортировка)
Имя функции | Сортирует по | Сохраняет связь ключ - значение | Порядок сортировки | Похожие функции |
---|---|---|---|---|
array_multisort() | значению | ассоциативные да, числовые нет | первый массив или настройки сортировки | array_walk() |
asort() | значению | да | по возрастанию | arsort() |
arsort() | значению | да | по убыванию | asort() |
krsort() | ключу | да | по убыванию | ksort() |
ksort() | ключу | да | по возрастанию | asort() |
natcasesort() | ключу | да | натуральный, чувствителен к регистру | natsort() |
natsort() | значению | да | натуральный | natcasesort() |
rsort() | значению | нет | по убыванию | sort() |
shuffle() | значению | нет | случайный | array_rand() |
sort() | значению | нет | по возрастанию | rsort() |
uasort() | значению | да | определяется пользователем | uksort() |
uksort() | ключу | да | определяется пользователем | uasort() |
usort() | значению | нет | определяется пользователем | uasort() |
Коментарии
Another way to do a case case-insensitive sort by key would simply be:
<?php
uksort($array, 'strcasecmp');
?>
Since strcasecmp is already predefined in php it saves you the trouble to actually write the comparison function yourself.
While this may seem obvious, user-defined array sorting functions ( uksort(), uasort(), usort() ) will *not* be called if the array does not have *at least two values in it*.
The following code:
<?php
function usortTest($a, $b) {
var_dump($a);
var_dump($b);
return -1;
}
$test = array('val1');
usort($test, "usortTest");
$test2 = array('val2', 'val3');
usort($test2, "usortTest");
?>
Will output:
string(4) "val3"
string(4) "val2"
The first array doesn't get sent to the function.
Please, under no circumstance, place any logic that modifies values, or applies non-sorting business logic in these functions as they will not always be executed.
Stabilizing the sort functions (in this case, usort).
<?php
function stable_usort(&$array, $cmp)
{
$i = 0;
$array = array_map(function($elt)use(&$i)
{
return [$i++, $elt];
}, $array);
usort($array, function($a, $b)use($cmp)
{
return $cmp($a[1], $b[1]) ?: ($a[0] - $b[0]);
});
$array = array_column($array, 1);
}
?>
Tags each array element with its original position in the array so that when the comparison function returns 0 the tie can be broken to put the earlier element first.