php演绎(2)——数组的排序

类别:编程语言 点击:0 评论:0 推荐:
第二节 数组的排序

数组的排序是个让人很头痛的问题,光是各种名目的排序法就让人晕晕的了,不过它是如此的重要,以至于我们不能不重点讨论它。好在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 
/** ************************************************************
* 一个多维数组排序的例子
* @ [email protected]
* @ 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内部使用多维数组来实现的。

本文地址:http://com.8s8s.com/it/it29254.htm