我想在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";
我找到了一些算法,但我想要一种快速且语句数量少的方法。忽略区分大小写对我来说很特别。感谢。
答案 0 :(得分:14)
见
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 :(得分:5)
您的示例有两个假设:
您只处理简单的一维数组。
按字母顺序排序后,您的索引将更新,以便按字母顺序将第一个元素分配给键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
}
other array sorting functions可能更合适。例如,我上面使用的简单一个将大写放在小写的前面,所以如果你将“security”作为一个项目(全部是小写),那么它将继续“Stackoverflow”,因为大写{{ 1}}优先于s
与se
。要在不区分大小写的情况下进行排序,可以使用natcasesort()
,这将使用给定的数组生成以下内容:
st
答案 2 :(得分:4)
从版本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
和{{1 ksort
作为自定义函数的变体:
strcasecmp
您可以将相同的概念应用于任何其他sorting functions。
答案 3 :(得分:0)
您可以使用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 );