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

时间:2010-01-17 07:27:52

标签: php algorithm sorting performance

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

答案 0 :(得分:14)

答案 1 :(得分:5)

您的示例有两个假设:

  1. 您只处理简单的一维数组。

  2. 按字母顺序排序后,您的索引将更新,以便按字母顺序将第一个元素分配给键0,依此类推。

  3. 鉴于这些参数,您最简单的解决方案是使用数组方法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}}优先于sse。要在不区分大小写的情况下进行排序,可以使用natcasesort(),这将使用给定的数组生成以下内容:

    st

答案 2 :(得分: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,还可以使用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 );