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