PHP 数组的各种排序 原:如何使用强大的PHP函数对数组进行排序



如果你已经使用了一段时间PHP的话,那么,你应该已经对它的数组比较熟悉了——这种数据结构允许你在单个变量中存储多个值,并且可以把它们作为一个集合进行操作。

经常,开发人员发现在PHP中使用这种数据结构对值或者数组元素进行排序非常有用。PHP提供了一些适合多种数组的排序函数,这些函数允许你在数组内部对元素进行排列,也允许用很多不同的方法对它们进行重新排序。在这篇文章中我们将讨论该排序中最重要的几个函数。

简单排序

首先,让我们来看看最简单的情况:将一个数组元素从低到高进行简单排序,这个函数既可以按数字大小排列也可以按字母顺序排列。PHP的sort()函数实现了这个功能,如Listing A所示:

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

    )



也能使用rsort()函数进行排序,它的结果与前面所使用的sort()简单排序结果相反。
Rsort()函数对数组元素进行从高到低的倒排,同样可以按数字大小排列也可以按字母顺序排列。


Listing B给我们展示了它的一个例子:

    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

    )



根据关键字排序

当我们使用数组的时候,经常根据关键字对数组重新排序,从高到低。
    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

    )



    Krsort()函数是根据关键字对数组进行倒排,Listing D就是这样的例子:

    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

    )



    根据值排序

    如果你想使用值排序来取代关键字排序的话,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

    )



    现在,你肯定能猜到这种排序也可以进行倒排,它使用arsort()函数完成这个功能。

    Listing F就是一个例子:

    Listing F

 
  <?php
        $data = array("US" => "United States", "IN" => "India", "DE" => "Germany", "ES" => "Spain");
        arsort($data);
        print_r($data);
    ?>



下面是它的输出结果,根据值按字母表顺序进行倒排。将下面的结果与用krsort()函数进行倒排后生成的结果进行比较,就能很容易明白两者的不同了。

   
Array (

        [US] => United States

        [ES] => Spain

        [IN] => India

        [DE] => Germany

    )



自然语言排序

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

    )



根据用户自定义的规则排序

PHP也能让你定义自己的排序算法,
你可以通过创建你自己的比较函数,并把它传递给usort()函数。

如果第一个参数比第二个参数“小”的话,
比较函数必须返回一个比0小的数,

如果第一参数比第二个参数“大”的话,
比较函数应该返回一个比0大的数。

Listing I就是这样的一个例子,在这个例子中根据它们的长度对数组元素进行排序,最短的项放在最前面:

    Listing I

 
  <?php

        $data = array("joe@host.com", "john.doe@gh.co.uk", "asmithsonian@us.info", "jay@zoo.tw");

        usort($data, 'sortByLen');

        print_r($data);

        function sortByLen($a, $b) {

            if (strlen($a) == strlen($b)) {

                return 0;

            } else {

                return (strlen($a) > strlen($b)) ? 1 : -1;

            }

        }

    ?>



这样,就创建了我们自己的比较函数,这个函数使用strlen()函数比较每一个字符串的个数,然后分别返回1,0或-1.这个返回值是决定元素排列的基础。

下面是它的输出结果:

  
  Array (
        [0] => jay@zoo.tw

        [1] => joe@host.com

        [2] => john.doe@gh.co.uk

        [3] => asmithsonian@us.info

    )



自然语言排序

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

        )



根据用户自定义的规则排序

PHP也能让你定义自己的排序算法,你可以通过创建你自己的比较函数,并把它传递给usort()函数。
如果第一个参数比第二个参数“小”的话,比较函数必须返回一个比0小的数,如果第一参数比第二个参数“大”的话,比较函数应该返回一个比0大的数。

Listing I就是这样的一个例子,在这个例子中根据它们的长度对数组元素进行排序,最短的项放在最前面:

    Listing I

    <?php

        $data = array("joe@host.com", "john.doe@gh.co.uk", "asmithsonian@us.info", "jay@zoo.tw");

        usort($data, 'sortByLen');

        print_r($data);

        function sortByLen($a, $b) {

            if (strlen($a) == strlen($b)) {

                return 0;

            } else {

                return (strlen($a) > strlen($b)) ? 1 : -1;

            }

        }

    ?>



这样,就创建了我们自己的比较函数,这个函数使用strlen()函数比较每一个字符串的个数,然后分别返回1,0或-1.这个返回值是决定元素排列的基础。

下面是它的输出结果:

    Array (

        [0] => jay@zoo.tw

        [1] => joe@host.com

        [2] => john.doe@gh.co.uk

        [3] => asmithsonian@us.info

    )



多维排序

最后,PHP也允许在多维数组上执行一些比较复杂的排序——例如,首先对一个嵌套数组使用一个普通的关键字进行排序,然后再根据另一个关键字进行排序。

这与使用SQL的ORDER BY语句对多个字段进行排序非常相似。为了能更好的明白它是如何工作的,请仔细看Listing J所举的例子:

    Listing J

   
<?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 M

            [rating] => 3

        )

        [2] => Array

        (

            [id] => 4

            [name] => Lusain

            [rating] => 3

        )

        [3] => Array

        (

            [id] => 3

            [name] => The Killers

            [rating] => 4

        )

    )


array_multisort()函数是PHP中最有用的函数之一,它有非常广泛的应用范围。
另外,就如你在例子中所看到的,它能对多个不相关的数组进行排序,也可以使用其中的一个元素作为下次排序的基础,还可以对数据库结果集进行排序。

这些例子应该让你对PHP中各种数组排序函数的使用有了初步的了解,也向你展示了一些隐藏在PHP数组处理工具包的内部功能。

最后,祝你能愉快的使用这些功能!

一、数组操作的基本函数

数组的键名和值
array_values($arr);获得数组的值
array_keys($arr);获得数组的键名
array_flip($arr);数组中的值与键名互换(如果有重复前面的会被后面的覆盖)
in_array("apple",$arr);在数组中检索apple
array_search("apple",$arr);在数组中检索apple ,如果存在返回键名
array_key_exists("apple",$arr);检索给定的键名是否存在数组中
isset($arr[apple]):检索给定的键名是否存在数组中

数组的内部指针
current($arr);返回数组中的当前单元
pos($arr);返回数组中的当前单元
key($arr);返回数组中当前单元的键名
prev($arr);将数组中的内部指针倒回一位
next($arr);将数组中的内部指针向前移动一位
end($arr);将数组中的内部指针指向最后一个单元
reset($arr;将数组中的内部指针指向第一个单元
each($arr);将返回数组当前元素的一个键名/值的构造数组,并使数组指针向前移动一位
list($key,$value)=each($arr);获得数组当前元素的键名和值

数组和变量之间的转换
extract($arr);用于把数组中的元素转换成变量导入到当前文件中,键名当作变量名,值作为变量值
注:(第二个参数很重要,可以看手册使用)使用方法 echo $a;
compact(var1,var2,var3);用给定的变量名创建一个数组

二、数组的分段和填充
数组的分段
array_slice($arr,0,3);可以将数组中的一段取出,此函数忽略键名
array_splice($arr,0,3,array("black","maroon"));可以将数组中的一段取出,与上个函数不同在于返回的序列从原数组中删除

分割多个数组
array_chunk($arr,3,TRUE);可以将一个数组分割成多个,TRUE为保留原数组的键名

数组的填充
array_pad($arr,5,'x');将一个数组填补到制定长度

三、数组与栈
array_push($arr,"apple","pear");将一个或多个元素压入数组栈的末尾(入栈),返回入栈元素的个数
array_pop($arr);将数组栈的最后一个元素弹出(出栈)

四、数组与列队
array_shift($arr);数组中的第一个元素移出并作为结果返回(数组长度减1,其他元素向前移动一位,数字键名改为从零技术,文字键名不变)
array_unshift($arr,"a",array(1,2));在数组的开头插入一个或多个元素

五、回调函数
array_walk($arr,'function','words');使用用户函数对数组中的每个成员进行处理(第三个参数传递给回调函数function)
array_mpa("function",$arr1,$arr2);可以处理多个数组(当使用两个或更多数组时,他们的长度应该相同)
array_filter($arr,"function");使用回调函数过滤数组中的每个元素,如果回调函数为TRUE,数组的当前元素会被包含在返回的结果数组中,数组的键名保留不变
array_reduce($arr,"function","*");转化为单值函数(*为数组的第一个值)

六、数组的排序
通过元素值对数组排序
sort($arr);由小到大的顺序排序(第二个参数为按什么方式排序)忽略键名的数组排序
rsort($arr);由大到小的顺序排序(第二个参数为按什么方式排序)忽略键名的数组排序
usort($arr,"function");使用用户自定义的比较函数对数组中的值进行排序(function中有两个参数,0表示相等,正数表示第一个大于第二个,负数表示第一个小于第二个)忽略键名的数组排序
asort($arr);由小到大的顺序排序(第二个参数为按什么方式排序)保留键名的数组排序
arsort($arr);由大到小的顺序排序(第二个参数为按什么方式排序)保留键名的数组排序
uasort($arr,"function");使用用户自定义的比较函数对数组中的值进行排序(function中有两个参数,0表示相等,正数表示第一个大于第二个,负数表示第一个小于第二个)保留键名的数组排序

通过键名对数组排序
ksort($arr);按照键名正序排序
krsort($arr);按照键名逆序排序
uksort($arr,"function");使用用户自定义的比较函数对数组中的键名进行排序(function中有两个参数,0表示相等,正数表示第一个大于第二个,负数表示第一个小于第二个)

自然排序法排序
natsort($arr);自然排序(忽略键名)
natcasesort($arr);自然排序(忽略大小写,忽略键名)

七、数组的计算
数组元素的求和
array_sum($arr);对数组内部的所有元素做求和运算

数组的合并
array_merge($arr1,$arr2);合并两个或多个数组(相同的字符串键名,后面的覆盖前面的,相同的数字键名,后面的不会做覆盖操作,而是附加到后面)
“+”$arr1+$arr2;对于相同的键名只保留后一个
array_merge_recursive($arr1,$arr2); 递归合并操作,如果数组中有相同的字符串键名,这些值将被合并到一个数组中去。如果一个值本身是一个数组,将按照相应的键名把它合并为另一个数组。当数组 具有相同的数组键名时,后一个值将不会覆盖原来的值,而是附加到后面

数组的差集
array_diff($arr1,$arr2);返回差集结果数组
array_diff_assoc($arr1,$arr2,$arr3);返回差集结果数组,键名也做比较

数组的交集
array_intersect($arr1,$arr2);返回交集结果数组
array_intersect_assoc($arr1,$arr2);返回交集结果数组,键名也做比较

八、其他的数组函数
range(0,12);创建一个包含指定范围单元的数组
array_unique($arr);移除数组中重复的值,新的数组中会保留原始的键名
array_reverse($arr,TRUE);返回一个单元顺序与原数组相反的数组,如果第二个参数为TRUE保留原来的键名
//srand((float)microtime()*10000000); 随机种子触发器
array_rand($arr,2);从数组中随机取出一个或 多个元素
shuffle($arr);将数组的顺序打乱

九、按一定的规则返回数组

implode(string glue, array pieces);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值