2010-01-17 62 views
10

我想在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"; 

我已经发现了一些算法,但我想要的方式,速度快,有少数语句。忽略区分大小写对我来说很特别。谢谢。

回答

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 
} 

other array sorting functions这可能是一个更好的选择。例如,上面我使用的简单的一个将大写字母放在小写字母的前面,因此如果您将“安全性”作为一个项目(所有小写字母),它会在“Stackoverflow”之后进行,因为大写s会优先于se而不是st。排序时不区分大小写,你可以使用natcasesort(),这将产生与定数组中的以下内容:

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

排序区分大小写。在*答案之前,Stackoverflow将被放置*。 – Tyzoid 2013-04-06 19:48:50

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 

您可以将同样的理念,任何其他sorting functions的。

+0

这个问题的正确答案是'''ksort($ data,SORT_FLAG_CASE | SORT_NATURAL);''' – 2015-11-10 14:41:06

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);