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";

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

Ответ 2

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

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

  • После сортировки в алфавитном порядке ваш индекс будет обновляться так, чтобы первому элементу в алфавитном порядке был назначен ключ 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 vs. st. Чтобы сортировать без чувствительности к регистру, вы можете использовать natcasesort(), что создало бы следующие данные с данным массивом:

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

Ответ 3

Начиная с версии 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

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

Ответ 4

Вы можете использовать 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' );

После сортировки вы можете захотеть reset индексы массива.

$arr = array_values( $arr );