PHP:如何按字母顺序对数组的值进行排序?

11

我想在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个回答

15

1
你肯定是想用 strcasecmp 作为自定义比较器吧? :P - Ja͢ck

5

你的示例做了两个假设:

  1. 你只涉及简单的一维数组。

  2. 在按字母顺序排序后,索引将更新,以便按字母顺序排列的第一个元素将被分配键 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
}

还有一些其他的数组排序函数可能更适合。例如,我上面使用的简单函数会将大写字母排在小写字母前面,因此如果您有一个全是小写字母的项目“security”,它将会在“Stackoverflow”之后,因为大写字母s优先于sest。要进行不区分大小写的排序,可以使用natcasesort()函数,在给定的数组中会产生以下结果:

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

排序是区分大小写的。Stackoverflow将被放置在答案之前 - Tyzoid

4

从版本5.4.0开始,您可以使用任何一个sortasortksort等函数,并传递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,正如其他人所提到的,还可以使用uasortksort变体,其中strcasecmp作为自定义函数:

natcasesort( $array );          // Non-associative array
uasort( $array, 'strcasecmp' ); // Associative array
uksort( $array, 'strcasecmp' ); // Associative array, sort by indices

您可以将相同的概念应用于任何其他排序函数

这个问题的正确答案是ksort($data, SORT_FLAG_CASE | SORT_NATURAL); - Oleg Abrazhaev

1
你可以使用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 );

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接