PHP: как сортировать значения массива в алфавитном порядке?

Я хочу отсортировать значения массива в алфавитном порядке в PHP. Если все значения начинаются с одного символа, их следует отсортировать с помощью второго символа и так далее. Игнорировать регистр.

Например:

before:
values[0] = "programming";
values[1] = "Stackoverflow";
values[2] = "question";
values[3] = "answers";
values[4] = "AA Systems";

after:
values[0] = "AA Systems";
values[1] = "answers";
values[2] = "programming";
values[3] = "question";
values[4] = "Stackoverflow";

Я нашел некоторые алгоритмы, но я хочу, чтобы путь был быстрым и с небольшим количеством операторов. Игнорирование чувствительных к регистру особенное для меня. Спасибо.

4 ответов


посмотреть


ваш пример делает два предположения:

  1. что вы имеете дело только с простыми одномерными массивами.

  2. что после сортировки в алфавитном порядке ваш индекс будет обновляться, так что первому элементу в алфавитном порядке будет присвоен ключ 0 и так далее.

учитывая эти параметры, самым простым решением является использование метода массива sort(). С вашим примером:

$values[0] = "programming";
$values[1] = "Stackoverflow";
$values[2] = "question";
$values[3] = "answers";
$values[4] = "AA Systems";

sort($values);

что приведет к следующее:

Array {
     [0] => AA Systems
     [1] => Stackoverflow
     [2] => answers
     [3] => programming
     [4] => question
}

здесь другие функции сортировка массива это может быть лучше подходит. Например, самый простой вариант я использую выше ставит заглавные в строчные, так что если у вас "безопасность" как элемент (все строчные) она будет идти после "сайте StackOverflow" с прописной s будет иметь приоритет над se и st. Чтобы сортировать без учета регистра, вы можете использовать natcasesort(), который произвел бы следующее С заданный массив:

Array {
     [0] => AA Systems
     [1] => answers
     [2] => programming
     [3] => question
     [4] => Stackoverflow
}

начиная с версии 5.4.0, вы можете просто использовать sort, asort, ksort, etc. функции и передать SORT_FLAG_CASE флаг.

sort( $array, SORT_FLAG_CASE );  // Non-associative array
asort( $array, SORT_FLAG_CASE ); // Associative array
ksort( $array, SORT_FLAG_CASE ); // Associative array, sort by indices

если у вас есть более старая версия и вы не готовы к обновлению (или не можете), вы можете использовать natcasesort как упоминали другие, но и uasort и ksort вариантов с strcasecmp как пользовательская функция:

natcasesort( $array );          // Non-associative array
uasort( $array, 'strcasecmp' ); // Associative array
uksort( $array, 'strcasecmp' ); // Associative array, sort by indices

вы можете применить ту же концепцию к любому из других функции сортировки.


можно использовать uasort(): http://php.net/manual/en/function.uasort.php

uasort( $arr, 'strcasecmp' );

второй аргумент-это функция, которая сравнивает значения. Функция должна возвращать -1, 0 или 1. Вот шаблон, который вы можете использовать для пользовательской функции.

function cmp( $a, $b ) {
  if ( $a == $b ) return 0;
  elseif ( $a > $b ) return 1;
  elseif ( $a < $b ) return -1;
}

uasort( $arr, 'cmp' );

после сортировки вы можете сбросить индексы массива.

$arr = array_values( $arr );