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

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

Видеть

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

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

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

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

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

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

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

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