PHP数组--排序函数

有时候,一个php函数就能省去我们大量的代码,在写程序的时候,如果能灵活运用这些函数,将大大节省时间,提高效率,下面总结的是php常用的数组排序函数,phper一定会用到的。

操作方法

  • 01

    1、sort()简单排序: 首先,让我们来看看最简单的情况:将一个数组元素从低到高进行简单排序,这个函数既可以按数字大小排列也可以按字母顺序排列。 Listing A<?php    $data = array(5,8,1,7,2);    sort($data);    print_r($data); ?>输出结果如下所示:Array ( [0] => 1 [1] => 2 [2] => 5 [3] => 7 [4] => 8 )

  • 02

    2、rsort()简单排序倒序: 也能使用rsort()函数进行排序,它的结果与前面所使用的sort()简单排序结果相反。Rsort()函数对数组元素进行从高到低的倒排,同样可以按数字大小排列也可以按字母顺序排列。 Listing B<?php    $data = array(5,8,1,7,2); rsort($data); print_r($data);?>它的输出结果如下:Array ([0] => 8 [1] => 7 [2] => 5 [3] => 2 [4] => 1 )

  • 03

    3、ksort()根据关键字排序: 当我们使用数组的时候,经常根据关键字对数组重新排序,从高到低。Ksort()函数就是根据关键字进行排序的函数,同时,它在排序的过程中会保持关键字的相关性。Listing C就是一个例子:Listing C<?php    $data = array("US" => "United States", "IN" => "India", "DE" => "Germany","ES"=>"Spain"); ksort($data); print_r($data); ?>它的输出结果如下:Array ( [DE] => Germany    [ES] => Spain    [IN] => India    [US] => United States)

  • 04

    4、Krsort()函数是根据关键字对数组进行倒排 : Listing D<?php $data = array("US" => "United States", "IN" => "India", "DE" => "Germany","ES"=>"Spain"); krsort($data); print_r($data); ?>它的输出结果如下:Array ( [US] => United States    [IN] => India    [ES] => Spain    [DE] => Germany)

  • 05

    5、 asort()根据值排序 : 如果你想使用值排序来取代关键字排序的话,PHP也能满足你的要求。你只要使用asort()函数来代替先前提到的ksort()函数就可以了。如Listing E所示:Listing E<?php $data = array("US" => "United States", "IN" => "India", "DE" => "Germany","ES"=>"Spain"); asort($data); print_r($data); ?>下面就是它的输出结果。请注意这个结果与上面使用ksort()函数所得到的结果的不同——在这两种情况中,都是按字母顺序进行排序的,但是它们是根据数组的不同字段进行排序的。同时,请注意关键字-值之间的联系会始终保持;它只是关键字-值对排序后的一种方式,排序并不会改变它们的对应关系。Array ( [DE] => Germany    [IN] => India    [ES] => Spain    [US] => United States)

  • 06

    6、arsort()根据值倒序排序:现在,你肯定能猜到这种排序也可以进行倒排,它使用arsort()函数完成这个功能。Listing F就是一个例子:Listing F<?php $data = array("US" => "United States", "IN" => "India", "DE" => "Germany","ES"=>"Spain"); asort($data); print_r($data); ?>下面是它的输出结果,根据值按字母表顺序进行倒排。将下面的结果与用krsort()函数进行倒排后生成的结果进行比较,就能很容易明白两者的不同了。Array ( [US] => United States    [ES] => Spain    [IN] => India    [DE] => Germany)

  • 07

    7、natsort自然语言排序 : natcasesort:同natsort排序算法,但不区分大小写字母排序 PHP有一个非常独特的排序方式,这种方式使用认知而不是使用计算规则。这种特性称为自然语言排序,当创建模糊逻辑应用软件的时候这种排序方式非常有用。下面大家可以来看看它的一个简单例子,如Listing G所示:Listing G<?php    $data = array("book-1", "book-10", "book-100", "book-5"); sort($data); print_r($data);    natsort($data); print_r($data);?>它的输出结果如下:Array ( [0] => book-1    [1] => book-10    [2] => book-100    [3] => book-5)Array(    [0] => book-1    [3] => book-5    [1] => book-10 [2] => book-100)它们的不同已经很清楚了:第二个排序结果更直观,更“人性化”,然而第一个则更符合算法规则,更具“计算机”特点。 自然语言能进行倒排吗?答案是肯定的!只要对natsort()的结果使用array_reverse()函数就可以了,Listing H就是一个简单例子:Listing H<?php    $data = array("book-1", "book-10", "book-100", "book-5"); natsort($data); print_r(array_reverse($data));?>下面是它的输出结果:Array ([0] => book-100[1] => book-10[2] => book-5[3] => book-1)

  • 08

    8、array_multisort 多维数组排序 最后,PHP也允许在多维数组上执行一些比较复杂的排序——例如,首先对一个嵌套数组使用一个普通的关键字进行排序,然后再根据另一个关键字进行排序。这与使用SQL的ORDER BY语句对多个字段进行排序非常相似。为了能更好的明白它是如何工作的,请仔细看Listing J所举的例子:一维数组排序: <?php$ar1 = array("10", 100, 100, "a");$ar2 = array(1, 3, "2", 1);array_multisort($ar1, $ar2);var_dump($ar1);var_dump($ar2);?> 多维数组排序: 例子1:<?php    $data = array( array("id" => 1, "name" => "Boney M", "rating" => 3), array("id" => 2, "name" => "Take That", "rating" => 1), array("id" => 3, "name" => "The Killers", "rating" => 4), array("id" => 4, "name" => "Lusain", "rating" => 3), ); foreach ($data as $key => $value) {        $name[$key] = $value['name']; $rating[$key] = $value['rating']; }    array_multisort($rating, $name, $data); print_r($data);?>这里,我们在$data数组中模拟了一个行和列数组。然后,我使用array_multisort()函数对数据集合进行重排,首先是根据rating进行排序,然后,如果rating相等的话,再根据name排序。它的输出结果如下:Array ( [0] => Array( [id] => 2 [name] => Take That [rating] => 1 ) [1] => Array( [id] => 1 [name] => Boney [rating] => 3 ) [2] => Array( [id] => 4 [name] => Lusain [rating] => 3 ) [3] => Array( [id] => 3 [name] => The Killers [rating] => 4 ) ) array_multisort()函数是PHP中最有用的函数之一,它有非常广泛的应用范围。另外,就如你在例子中所看到的,它能对多个不相关的数组进行排序,也可以使用其中的一个元素作为下次排序的基础,还可以对数据库结果集进行排序。 例子2: $guys = Array( array('name'=>'caida','score'=>80,'group'=>'A'), array('name'=>'yangfan','score'=>60,'group'=>'B'), array('name'=>'xiaopang','score'=>70,'group'=>'C'), ); foreach($guys as $v){ $score[] = $v['score']; $name[] = $v['name']; } array_multisort($score, SORT_DESC, $name, $guys); print_r($score); print_r($name); print_r($guys); Array ( [0] => 80 [1] => 70 [2] => 60 ) Array ( [0] => caida [1] => xiaopang [2] => yangfan ) Array ( [0] => Array ( [name] => caida [score] => 80 [group] => A ) [1] => Array ( [name] => xiaopang [score] => 70 [group] => C ) [2] => Array ( [name] => yangfan [score] => 60 [group] => B ) ) 例子3: <?php$ar = array ( array ("10", 100, 100, "a"), array (1, 3, "2", 1));array_multisort ($ar[0], SORT_ASC, SORT_STRING,                 $ar[1], SORT_NUMERIC, SORT_DESC); print_r($ar);?> 对数据库结果进行排序 本例中 data 数组中的每个单元表示一个表中的一行。这是典型的数据库记录的数据集合。 例子中的数据如下: volume | edition -------+--------    67 |       2    86 |       1    85 |       6    98 |       2    86 |       6    67 |       7 数据全都存放在名为 data 的数组中。这通常是通过循环从数据库取得的结果,例如mysql_fetch_assoc()。 <?php$data[] = array('volume' => 67, 'edition' => 2);$data[] = array('volume' => 86, 'edition' => 1);$data[] = array('volume' => 85, 'edition' => 6);$data[] = array('volume' => 98, 'edition' => 2);$data[] = array('volume' => 86, 'edition' => 6);$data[] = array('volume' => 67, 'edition' => 7);?> 本例中将把 volume 降序排列,把 edition 升序排列。 现在有了包含有行的数组,但是 array_multisort() 需要一个包含列的数组,因此用以下代码来取得列,然后排序。 <?php// 取得列的列表foreach ($data as $key => $row) {    $volume[$key]  = $row['volume'];    $edition[$key] = $row['edition'];}// 将数据根据 volume 降序排列,根据 edition 升序排列// 把 $data 作为最后一个参数,以通用键排序array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data);?> 数据集合现在排好序了,结果如下: volume | edition -------+--------    98 |       2    86 |       1    86 |       6    85 |       6    67 |       2    67 |       7 不区分字母大小写排序 SORT_STRING 和 SORT_REGULAR 都是区分大小写字母的,大写字母会排在小写字母之前。 要进行不区分大小写的排序,就要按照原数组的小写字母拷贝来排序。 <?php    $array = array('Alpha', 'atomic', 'Beta', 'bank');    $array_lowercase = array_map('strtolower', $array);    array_multisort($array_lowercase, SORT_ASC, SORT_STRING, $array);    print_r($array);?> 以上例程会输出: Array (    [0] => Alpha    [1] => atomic    [2] => bank    [3] => Beta ) 名次排列 <?php $grade = array("score" => array(70, 95, 70.0, 60, "70"),               "name" => array("Zhang San", "Li Si", "Wang Wu",                               "Zhao Liu", "Liu Qi"));array_multisort($grade["score"], SORT_NUMERIC, SORT_DESC,                // 将分数作为数值,由高到低排序                $grade["name"], SORT_STRING, SORT_ASC);                // 将名字作为字符串,由小到大排序var_dump($grade);?> 以上例程会输出: array(2) {  ["score"]=>  array(5) {    [0]=>int(95)    [1]=> string(2) "70"    [2]=>float(70)    [3]=>int(70)    [4]=>int(60)  }  ["name"]=>  array(5) {    [0]=>string(5) "Li Si"    [1]=>string(6) "Liu Qi"    [2]=> string(7) "Wang Wu"    [3]=> string(9) "Zhang San"    [4]=>string(8) "Zhao Liu"  } } 本例中对包含成绩的数组 $grade 按照分数(score)由高到低进行排序,分数相同的人则按照名字(name)由小到大排序。排序后李四 95 分为第一名,赵六 60 分为第五名没有异议。张三、王五和刘七都是 70 分,他们的名次则由其姓名的字母顺序排列,Liu 在前,Wang 在后而 Zhang 在最后。为了区别,三个 70 分分别用了整数,浮点数和字符串来表示,可以在程序输出中清楚地看到它们排序的结果。 排序顺序标志:SORT_ASC - 按照上升顺序排序(默认)SORT_DESC - 按照下降顺序排序排序类型标志:SORT_REGULAR - 将项目按照通常方法比较(默认)SORT_NUMERIC - 将项目按照数值比较SORT_STRING - 将项目按照字符串比较

  • 09

    9、usort()根据用户自定义的规则排序 PHP也能让你定义自己的排序算法,你可以通过创建你自己的比较函数,并把它传递给usort()函数。如果第一个参数比第二个参数“小”的话,比较函数必须返回一个比0小的数,如果第一参数比第二个参数“大”的话,比较函数应该返回一个比0大的数。Listing I就是这样的一个例子,在这个例子中根据它们的长度对数组元素进行排序,最短的项放在最前面:sortByLen 里面必须是固定格式<?php    $data = array("joe@", "@", "asmithsonian@", "jay@"); usort($data, 'sortByLen');    print_r($data); function sortByLen($a, $b) {        if (strlen($a) == strlen($b)) { return; } else { return (strlen($a) > strlen($b)) ? 1 : -1; } }?>这样,就创建了我们自己的比较函数,这个函数使用strlen()函数比较每一个字符串的个数,然后分别返回1,0或-1.这个返回值是决定元素排列的基础。下面是它的输出结果: Array ( [0] => @ [1] => joe@ [2] => jay@ [3] => asmithsonian@ )

  • 10

    10、uksort 和 uasort 是对关联数组进行排序的,方法同上。 多维数组按值排序 消息 × loading.. /** * 自定义排序函数 * @param $param1 * @param $param2 * @return 0(不移动) 1(正向调换顺序) -1(逆向调换顺序) */ function my_sort($param1, $param2){ if($param1['value'] == $param2['value']) return 0; else return $param1['value'] > $param2['value'] ? 1 : -1; } $arr = array( 'a'=>array('key'=>'定义1', 'value'=>'20'), 'b'=>array('key'=>'定义2', 'value'=>'1'), 'c'=>array('key'=>'定义3', 'value'=>'10'), 'd'=>array('key'=>'定义4', 'value'=>'5'), 'e'=>array('key'=>'定义5', 'value'=>'21'), 'f'=>array('key'=>'定义6', 'value'=>'4'), 'g'=>array('key'=>'定义7', 'value'=>'3'), ); uasort($arr, 'my_sort'); var_dump($arr); /*输出值 array (size=7) 'b' => array (size=2) 'key' => string '定义2' (length=7) 'value' => string '1' (length=1) 'g' => array (size=2) 'key' => string '定义7' (length=7) 'value' => string '3' (length=1) 'f' => array (size=2) 'key' => string '定义6' (length=7) 'value' => string '4' (length=1) 'd' => array (size=2) 'key' => string '定义4' (length=7) 'value' => string '5' (length=1) 'c' => array (size=2) 'key' => string '定义3' (length=7) 'value' => string '10' (length=2) 'a' => array (size=2) 'key' => string '定义1' (length=7) 'value' => string '20' (length=2) 'e' => array (size=2) 'key' => string '定义5' (length=7) 'value' => string '21' (length=2) */

(0)

相关推荐

  • C语言数组作为函数参数

    数组可以作为函数的参数使用,进行数据传送.数组用作函数参数有两种形式,一种是把数组元素(下标变量)作为实参使用:另一种是把数组名作为函数的形参和实参使用. 数组元素作函数实参 数组元素就是下标变量,它 ...

  • 表格中RANK排序函数的用法

    日常工作中,经常会遇到各类数据的排序,一条一条的统计的话,不仅耗时,而且效率很低容易出错,那么下面来介绍一下排序函数RANK的用法. 题目以及方法 01 首先如图所示,要将表中的公司KPI和年度利润进 ...

  • 表格自动排序函数(excel自动排序公式)

    数据统计中,排序是常见的需求.今天教大家三个可以进行排序的函数.案例:将下图 1 中的分数分别按以下需求提取出来:从大到小排序从小到大排序计算每个分数对应的排名效果如下图 2 所示.解决方案:1. 从 ...

  • Rank排序函数的使用实例

    Rank函数是一个进行数据排序的的函数,可以进行升序或降序排列,进而得到不同类型的名次.本例将从升序和降序两个方面入手,以学生成绩分数进行演示. 操作方法 01 首先打开一个包含学生成绩的工作簿,正常 ...

  • Javascript里有哪些常用的数组操作函数?

    在写JS(Javascript)代码时,我们经常会对数组进行各种操作.那么你知道JS有哪些常用的操作函数吗?下面来介绍一下,熟悉这些函数对我们平常开发有很大的帮助. 操作方法 01 首先我们看下数组的 ...

  • 巧用Excel函数:[4]RANK排序函数

    如何计算一个数字在数字列表中的排位呢?这就要用到RANK函数了.RANK函数的公式是RANK(number,ref,order),其中number为需要找到排位的数字,ref为数字所在的一组数据区域, ...

  • MATLAB如何对数组元素进行排序?

    介绍MATLAB中对数组元素排序的有关函数,介绍三个函数,分别是issorted,sort,sortrow. 操作方法 01 首先,通过issorted函数可以判断列表或者数组是否是升序.默认对列表使 ...

  • js数组常用的几个函数总结

    javascript中,数组是很常用的.数组的函数很多,下面分享几个常用的数组函数.每个函数都用浏览器测试过. 下面每个测试结果都是在google浏览器console上执行的. 操作方法 01 len ...

  • c语言函数中如何给一个字符串数组赋值

    C语言大多数人都会,然而会的人并不一定所有函数都记得住,下面将给大家介绍数组赋值函数的使用方法 操作方法 01 打开Visual C++ 6.0,新建一个C++ source file源文件 02 输 ...