使用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 />"; }