Ответ 1
См
-
natcasesort
: http://www.php.net/manual/en/function.natcasesort.php -
usort
: http://www.php.net/manual/en/function.usort.php с функцией сравнения, которая сравниваетstrtolower(a)
иstrtolower(b)
.
Я хочу сортировать значения массива в алфавитном порядке в 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";
Я нашел несколько алгоритмов, но мне нужен быстрый способ и с небольшим количеством операторов. Игнорирование чувствительности к регистру является для меня особенным. Спасибо.
См
natcasesort
: http://www.php.net/manual/en/function.natcasesort.phpusort
: http://www.php.net/manual/en/function.usort.php с функцией сравнения, которая сравнивает strtolower(a)
и strtolower(b)
.В вашем примере сделаны два предположения:
Что вы имеете дело только с простыми 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
}
Начиная с версии 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' );
После сортировки вы можете захотеть reset индексы массива.
$arr = array_values( $arr );