PHP функции для сортировки массива

Когда нужно отсортировать массив по каким-либо критериям, то, скорее всего, в PHP есть функция, которая поможет в этом. Но функций для сортировки массивов, что это может немного запутать. Например, PHP sort и другие.

Я думаю, что команда PHP понимает это, так как на php.net есть удобная сводная таблица по этим функциям. В этой статье я хочу рассмотреть основные функции сортировки массивов.

Некоторые из этих функций имеют двойников, которые содержат букву

в названиях.

означает «реверс» и указывает на порядок сортировки. Порядок сортировки по умолчанию, который мы будем рассматривать - по возрастанию (от меньшего к большему), тогда как «реверсивные» функции сортируют в порядке убывания (от большего к меньшему).

Функции, которые применяются к неассоциативным массивам

Во время сортировки функции не сохраняют ключ массива (индекс) для связи значений его элементов. Именно поэтому они, как правило, применяется к неассоциативным массивам, для которых сохранение связи ключей не столь важно, как при работе с ассоциативными массивами.

  • PHP array sort: Сортировка массива «по умолчанию»;
  • rsort: Сортировка массива в обратном порядке.

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

$text = array('Interdum congue nec', 'Duis et sollicitudin',
'Vestibulum sit amet', 'Duis luctus porttitor',
'Nunc massa lectus');
 
sort($text, SORT_STRING);

До сортировки массив $text выглядит следующим образом:

array (size=5)
0 => string ‘Interdum congue nec’ (length=19)
1 => string ‘Duis et sollicitudin’ (length=20)
2 => string ‘Vestibulum sit amet’ (length=19)
3 => string ‘Duis luctus porttitor’ (length=21)
4 => string ‘Nunc massa lectus’ (length=17)

После сортировки с помощью функции sort PHP (массив был переиндексирован):

array (size=5)
0 => string ‘Duis et sollicitudin’ (length=20)
1 => string ‘Duis luctus porttitor’ (length=21)
2 => string ‘Interdum congue nec’ (length=19)
3 => string ‘Nunc massa lectus’ (length=17)
4 => string ‘Vestibulum sit amet’ (length=19

Если поддержание связи индекса-значения существенно, тогда можно использовать одну из функций для ассоциативных массивов (смотрите ниже).

Функции для применения к ассоциативным массивам

Использование каждой из перечисленных ниже функций гарантирует, что соответствие между ключами и значениями после сортировки будет сохраняться. Разница заключается в том, хотите ли вы отсортировать массив по ключам или значениям.

  • asort: Ассоциативная сортировка;
  • arsort: Ассоциативная сортировка в обратном порядке;
  • ksort: Работает таким же образом, как asort, но сортирует ключи массива;
  • krsort: Работает таким же образом, как arsort, но сортирует ключи массива в обратном порядке.

Следующие функции специализируются на «естественном порядке» (что объясняет часть «nat» в имени функции) сравнения строк. Вторая функция не чувствительна к регистру:

  • natsort;
  • natcasesort.

Если asort была применена к тому же массиву, который мы рассматривали выше:

asort($text, SORT_STRING);

Отсортированный массив будет выглядеть следующим образом:

array (size=5)
1 => string ‘Duis et sollicitudin’ (length=20)
3 => string ‘Duis luctus porttitor’ (length=21)
0 => string ‘Interdum congue nec’ (length=19)
4 => string ‘Nunc massa lectus’ (length=17)
2 => string ‘Vestibulum sit amet’ (length=19)

Функции сортировки массива по параметрам, определенным пользователем

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

usort: функция не поддерживает взаимосвязь между индексом и значением массива.
uasort: эта функция поддерживает взаимосвязь индекса-значения массива.
uksort: эта функция делает то же самое, но сортировка применяется к ключам массива.

Давайте предположим, что я провожу анализ текста, и хочу отсортировать фразы по длине:

$text = array('Interdum congue nec', 'Duis et sollicitudin',
'Vestibulum sit amet', 'Duis luctus porttitor',
'Nunc massa lectus');
 
//Определенная пользователем функция обратного вызова
function compareStrLength($a, $b){
 
 $lenA = strlen($a);
 $lenB = strlen($b);
 
 if ($lenA == $lenB) { return 0; }
 
 //Порядок по возрастанию
 return ($lenA < $lenB) ? -1 : 1;
 
 //"Реверсивный" порядок по возрастанию
 //возвращает ($lenA > $lenB) ? -1 : 1;
 
}
 
uasort($text, 'compareStrLength');

Отсортированный массив $text будет выглядеть следующим образом:

array (size=5)
4 => string ‘Nunc massa lectus’ (length=17)
0 => string ‘Interdum congue nec’ (length=19)
2 => string ‘Vestibulum sit amet’ (length=19)
1 => string ‘Duis et sollicitudin’ (length=20)
3 => string ‘Duis luctus porttitor’ (length=21)

На этом мой обзор средств сортировки массива (функции sort PHP и других) закончен. Я не включил в него все функции, так как моя цель состояла в том, чтобы подчеркнуть разницу между функциями с аналогичными названиями. Еще одна важная функция сортировки - array_multisort. Она может быть использована для многомерных массивов, которые я не описал в данной статье.

Вадим Дворниковавтор-переводчик статьи «PHP Array Sort Functions: An Overview»