PHP: Как отсортировать значения массива в алфавитном порядке? - PullRequest
10 голосов
/ 17 января 2010

Я хочу отсортировать значения массива в алфавитном порядке в 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 ]

14 голосов
/ 17 января 2010

См

5 голосов
/ 17 января 2010

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

  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
}

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

Array {
     [0] => AA Systems
     [1] => answers
     [2] => programming
     [3] => question
     [4] => Stackoverflow
}
4 голосов
/ 11 мая 2012

Начиная с версии 5.4.0, вы можете просто использовать любую из функций sort, asort, ksort и т. Д. И передавать флаг 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

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

0 голосов
/ 09 августа 2014

Вы можете использовать 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 );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...