第二节 数组的排序
数组的排序是个让人很头痛的问题,光是各种名目的排序法就让人晕晕的了,不过它是如此的重要,以至于我们不能不重点讨论它。好在PHP已经提供了很多排序的函数,让你可以不去了解这些排序的细节。排序的原理和效率比较,我们会在后边的章节专门讨论。
PHP里最一般的排序函数是sort(),PHP手册里对它的描述如下:
使用sort()将把原有数组按照ASCII码从小到大顺序重新排列,注意sort()是直接对数组操作,并不返回任何值。现在,让我们回到麻将上:),majiangArray的数组元素是这样的:花色_点数.gif,我们需要进行的排序是这样的:先按照花色将maijiangArray数组排序,而每个花色内部,依照点数大小排序。显然,上边的sort()函数正好符合这一要求。我们只要在showArray之前sort()一下就OK了。
PHP CODE
程序运行的效果图如下:
上边的例子之所以能够得到解决是因为我们预先按sort()的习惯来组织了元素的内容,将主要排序标准——花色放在前边,而将次要排序标准——点数放在后边,而分割它们的都是一样的符号“_”。如果有元素为10_10.gif,那么现有的次序将被打乱;而且依靠重组元素名的方法来实现排序始终有些不方便。这说明单纯的排序实际上并不实用,因为我们通常都是依照数组元素的某一个特性对数组进行排序。在实际应用中,我们通过多维数组来存放有多个属性的数组元素。举个例子很常见的例子,我们使用user_info这个数组来存放访问者的信息,访问者id、访问者的IP、访问日期和时间、语言和引用页分别被保存在user_info[“id”],user_info[“ip”],user_info[“date”],user_info[“time”],user_info[“language”]和user_info[“reference”]里边。如果我们需要根据访问时间来对user_ info数组排序,sort()就英雄无用武之地了。幸运的是PHP中提供了一个用于多维数组排序的函数array_multisort(),它可以根据多维数组的某元素的一个属性对多维数组进行排序。下面我们通过程序来看看它的作用。
PHP CODE
排序的结果如下:
多维数组是实现PHP文本数据库的重要手段,下一节我们将尝试编写一个class来封装对文本数据表的操作,当然,class内部使用多维数组来实现的。
数组的排序是个让人很头痛的问题,光是各种名目的排序法就让人晕晕的了,不过它是如此的重要,以至于我们不能不重点讨论它。好在PHP已经提供了很多排序的函数,让你可以不去了解这些排序的细节。排序的原理和效率比较,我们会在后边的章节专门讨论。
PHP里最一般的排序函数是sort(),PHP手册里对它的描述如下:
Sort (PHP 3, PHP 4 ) sort -- 对数组排序 说明 void sort ( array array [, int sort_flags]) 本函数对数组进行排序。当本函数结束时数组单元将被从最低到最高重新安排。 |
使用sort()将把原有数组按照ASCII码从小到大顺序重新排列,注意sort()是直接对数组操作,并不返回任何值。现在,让我们回到麻将上:),majiangArray的数组元素是这样的:花色_点数.gif,我们需要进行的排序是这样的:先按照花色将maijiangArray数组排序,而每个花色内部,依照点数大小排序。显然,上边的sort()函数正好符合这一要求。我们只要在showArray之前sort()一下就OK了。
PHP CODE
// 在showArray之前sort() sort( $user1 ); sort( $user2 ); sort( $user3 ); sort( $user4 ); showArray( $user1 ); showArray( $user2 ); showArray( $user3 ); showArray( $user4 ); |
程序运行的效果图如下:
上边的例子之所以能够得到解决是因为我们预先按sort()的习惯来组织了元素的内容,将主要排序标准——花色放在前边,而将次要排序标准——点数放在后边,而分割它们的都是一样的符号“_”。如果有元素为10_10.gif,那么现有的次序将被打乱;而且依靠重组元素名的方法来实现排序始终有些不方便。这说明单纯的排序实际上并不实用,因为我们通常都是依照数组元素的某一个特性对数组进行排序。在实际应用中,我们通过多维数组来存放有多个属性的数组元素。举个例子很常见的例子,我们使用user_info这个数组来存放访问者的信息,访问者id、访问者的IP、访问日期和时间、语言和引用页分别被保存在user_info[“id”],user_info[“ip”],user_info[“date”],user_info[“time”],user_info[“language”]和user_info[“reference”]里边。如果我们需要根据访问时间来对user_ info数组排序,sort()就英雄无用武之地了。幸运的是PHP中提供了一个用于多维数组排序的函数array_multisort(),它可以根据多维数组的某元素的一个属性对多维数组进行排序。下面我们通过程序来看看它的作用。
PHP CODE
<?php /** ************************************************************ * 一个多维数组排序的例子 * @ Easy@bjpeu.edu.cn * @ 2003-6-6 ** *************************************************************/ // 显示函数,用表格的形式显示数组内容 function showUser( $userArray ) { echo '<table border="1" cellpadding="0" cellspacing="5" style="border-collapse: collapse" bordercolor="#111111" width="100%" style="{ color: #000000; font-size: 9pt; font-family: Verdana }" > <tr> <td width="4%"><span lang="zh-cn">序号</span></td> <td width="14%">IP</td> <td width="17%"><span lang="zh-cn">日期</span></td> <td width="16%"><span lang="zh-cn">时间</span></td> <td width="14%"><span lang="zh-cn">语言</span></td> <td width="35%"><span lang="zh-cn">引用页</span></td> </tr> '; for ( $i = 0 ; $i < count( $userArray["id"] ) ; $i++ ) { echo '<tr> <td width="4%">' . $userArray["id"][$i] . '</td> <td width="14%">' . $userArray["ip"][$i] . '</td> <td width="17%">' . $userArray["date"][$i] . '</td> <td width="16%">' . $userArray["time"][$i] . '</td> <td width="14%">' . $userArray["language"][$i] . '</td> <td width="35%">' . $userArray["reference"][$i] . '</td> </tr> '; } echo '</table>'; } unset($user_info); // 开始存储用户信息 // 第一个 $user_info["id"][] = 1; $user_info["ip"][] = '202.204.203.7'; $user_info["date"][] = '06-07-2002'; $user_info["time"][] = '20:24'; $user_info["language"][] = 'zh-cn'; $user_info["reference"][] = 'http://exlc.soft.com/es5'; // 第二个 $user_info["id"][] = 2; $user_info["ip"][] = '202.204.203.8'; $user_info["date"][] = '06-08-2002'; $user_info["time"][] = '04:32'; $user_info["language"][] = 'zh-cn'; $user_info["reference"][] = 'http://exlc.soft.com/es5'; // 第三个 $user_info["id"][] = 3; $user_info["ip"][] = '202.204.203.9'; $user_info["date"][] = '06-09-2002'; $user_info["time"][] = '05:12'; $user_info["language"][] = 'zh-cn'; $user_info["reference"][] = 'http://exlc.soft.com/es5'; // 以时间为索引对数组排序 array_multisort ( $user_info["time"], SORT_STRING , SORT_ASC, $user_info["id"],// 需要与时间保持关联的属性项写到后边 $user_info["ip"], $user_info["date"], $user_info["language"], $user_info["reference"] ); showUser( $user_info );//看看结果 ?> |
排序的结果如下:
多维数组是实现PHP文本数据库的重要手段,下一节我们将尝试编写一个class来封装对文本数据表的操作,当然,class内部使用多维数组来实现的。