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 ответов
посмотреть
-
natcasesort
: http://www.php.net/manual/en/function.natcasesort.php -
usort
: http://www.php.net/manual/en/function.usort.php с функцией компаратора, которая сравниваетstrtolower(a)
иstrtolower(b)
.
ваш пример делает два предположения:
что вы имеете дело только с простыми одномерными массивами.
что после сортировки в алфавитном порядке ваш индекс будет обновляться, так что первому элементу в алфавитном порядке будет присвоен ключ 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 );