1.5 多维数组排序

使用PHP开发应用,几乎就是一直跟数组打交道。PHP数组的强大和灵活性能够解决大部分应用的问题。在数组编程中,常用的有sort()、ksort()等相关函数,使用它们就可以很方便地处理一维数组,比如按键值降序和升序排列。

这些函数不能用于多维数组,但是在开发中常常是对多维数组排序处理。下面我们定义一个二维数组,如代码清单1-3所示:

代码清单1-3定义一个标准二维数组

        <? php
        $a = array(
                array("sky", "blue"),
                array("apple", "red"),
                array("tree", "green")
            );
        ?>

这是一个简单的二维数组,数组的元素也是数组。我们可能需要对userid这个键排序,或者按汉字或英文字符排序。

为了给多维数组进行排序,我们需要自定义排序函数,然后再调用sort()、usort()、ksort()这些函数,让这些函数使用自定义函数。

uasort函数接受两个参数,并且返回一个值表示哪个参数应该排在前面。负数或FALSE意味着第一个参数应该排在第二个参数之前。正数或者TRUE表示第二个参数应该排在前面,如果值为0,则表示两个参数相等。

下面,我们对前面的数组第一个键进行排序,代码清单1-4是一个自定义函数。

代码清单1-4将数组按键值排序的自定义函数

        function my_compare($a, $b) {
        if ($a[1] < $b[1]) {
                return -1;
            }else if ($a[1] == $b[1]){
                return 0;
            }else{
                return 1;
            }
        }

这样一来,我们可以后面使用uasort调用这个自定义函数:

        uasort($a, 'my_compare');

PHP会把内层数组不断地发送给此自定义函数,从而将它排序完成。想要了解排序细节,可以输出函数里被比较的数值,由此我们可以看出自定义排序是如何被调用的。代码清单1-5是脚本的完整代码。

代码清单1-5多维数组排序

        <? php
        //定义多维数组
        $a = array(
                array("sky", "blue"),
                array("apple", "red"),
                array("tree", "green")
            );
        //自定义数组比较函数,按数组的第二个元素进行比较
        function my_compare($a, $b) {
            if ($a[1] < $b[1]) {
                return -1;
            }else if ($a[1] == $b[1]){
                return 0;
            }else{
                return 1;
            }
        }
        //排序
        usort($a, 'my_compare');
        //输出结果
        foreach($a as $elem) {
            echo "$elem[0] : $elem[1]<br />";
        }