首页 » PHP和MySQL Web开发(原书第4版) » PHP和MySQL Web开发(原书第4版)全文在线阅读

《PHP和MySQL Web开发(原书第4版)》3.7 多维数组的排序

关灯直达底部

对多于一维的数组进行排序,或者不按字母和数字的顺序进行排序,要复杂得多。PHP知道如何比较两个数字或字符串,但在多维数组中,每个元素都是一个数组。PHP不知道如何比较两个数组,所以需要建立一个比较它们的方法。在大多数情况下,单词和数字的顺序是显而易见的——但对于复杂的对象,问题就会多一些。

3.7.1 用户定义排序

这里有一个前面使用过的二维数组定义。这个数组存储了Bob的3种产品的代码、说明和价格:

$products=array(array('TIR','Tires',100),

array('OIL','Oil',10),

array('SPK','Spark Plugs',4));

如果对这个数组进行排序,最后的顺序会是怎样呢?因为我们知道各个数组内容所代表的意义,所以至少会有两种有用的排序方法。我们可能对产品的说明按字母排序,或者对价格按大小排序。两种结果都有可能,但需要用函数usort告诉PHP如何比较各个元素。要实现此功能,需要编写自己的比较函数。

如下所示的代码对订单数组中的第二列(说明),按字母进行排序:

function compare($x,$y){

if($x[1]==$y[1]){

return 0;

}else if($x[1]<$y[1]){

return-1;

}else{

return 1;

}

}

usort($products,'compare');

到目前为止,在本书中们已经调用了许多PHP内置函数。为了对这个数组排序,必须定义了一个自己的函数。在第5章中,将详细介绍如何编写函数,但在此做一些简要的介绍。

我们用关键词function定义一个函数。需要给出函数的名称,而且该名称应该有意义,例如在这个例子中,函数被命名为compare。许多函数都带有参数。compare函数有两个参数:一个为$x,另一个为$y。该函数的作用是比较两个值的大小。

在这个例子中,$x和$y将是主数组中的两个子数组,分别代表一种产品。因为计数是从0开始的,说明字段是这个数组的第二个元素,所以为了访问数组$x的说明字段,需要输入$x[1]和$y[1]来比较两个传递给函数的数组的说明字段。

当一个函数结束的时候,它会给调用它的代码一个答复。该答复称为返回值。为了返回一个值,在函数中使用关键词return。例如,return 1;该语句将数值1返回给调用它的代码。

为了能够被usort函数使用,compare函数必须比较$x和$y。如果$x等于$y,该函数必须返回0,如果$x小于$y,该函数必须返回负数,而如果大于,则返回一个正数。根据$x和$y的值,该函数将返回0、1或-1。

以上代码的最后一行语句调用了内置函数usort,该函数使用的参数分别是希望保存的数组($products)和比较函数的名称(compare)。

如果要让数组按另一种顺序存储,只要编写一个不同的比较函数。要按价格进行排序,就必须查看数组的第三列,从而创建如下所示的比较函数:

function compare($x,$y){

if($x[2]==$y[2]){

return 0;

}else if($x[2]<$y[2]){

return-1;

}else{

return 1;

}

}

当调用usort($products,'$compare')的时候,数组将按价格的升序来排序。

注意:当你通过运行这些代码来测试时,这些代码将不产生任何输出。这些代码只是将编写的大部分代码中的一部分。

usort中的"u"代表"user",因为这个函数要求传入用户定义的比较函数。asort和ksort对应的版本uasort和uksort也要求传入用户定义的比较函数。

类似于asort,当对非数字索引数组的值进行排序时,uasort才会被使用。如果值是简单的数字或文本则可以使用asort。如果要比较的值像数组一样复杂,可以定义一个比较函数,然后使用uasort。

类似于ksort,当对非数字索引数组的关键字进行排序时才使用uksort。如果值是简单的数字或文本就使用ksort。如果要比较的对象像数组一样复杂,可以定义一个比较函数,然后使用uksort。