第2章已经介绍了如何将客户的订单保存在一个文件中。文件中的每一行类似于如下所示:
15:42,20th April 4 tires 1 oil 6 spark plugs$434.00 22 Short St,Smalltown
要处理或完成这个订单,就要将它重新载入数组中。程序清单3-2显示了当前的订单文件。
程序清单3-2 vieworders.php——使用PHP显示Bob的订单内容
<?php
//create short variable name
$DOCUMENT_ROOT=$_SERVER['DOCUMENT_ROOT'];
$orders=file("$DOCUMENT_ROOT/../orders/orders.txt");
$number_of_orders=count($orders);
if($number_of_orders==0){
echo"<p><strong>No orders pending.
Please try again later.</strong></p>";
}
for($i=0;$i<$number_of_orders;$i++){
echo$orders[$i]."<br/>";
}
这个脚本的输出几乎和上一章中程序清单2-3的输出结果完全相同,如图2-4所示。这次,该脚本使用了file函数将整个文件载入一个数组中。文件中的每行则成为数组中的一个元素。这段代码还使用了count函数来统计数组中的元素个数。
此外,还可以将订单行中的每个区段载入到单独的数组元素中,从而可以分开处理每个区段或将它们更好地格式化。程序清单3-3很好地完成了这一功能。
程序清单3-3 vieworders2.php——用PHP分离、格式化并显示Bob的订单内容
<?php
//create short variable name
$DOCUMENT_ROOT=$_SERVER['DOCUMENT_ROOT'];
?>
<html>
<head>
<title>Bob's Auto Parts-Customer Orders</title>
</head>
<body>
<h1>Bob's Auto Parts</h1>
<h2>Customer Orders</h2>
<?php
//Read in the entire file.
//Each order becomes an element in the array
$orders=file("$DOCUMENT_ROOT/../orders/orders.txt");
//count the number of orders in the array
$number_of_orders=count($orders);
if($number_of_orders==0){
echo"<p><strong>No orders pending.
Please try again later.</strong></p>";
}
echo"<table border=/"1/">/n";
echo"<tr><th bgcolor=/"#CCCCFF/">Order Date</th>
<th bgcolor=/"#CCCCFF/">Tires</th>
<th bgcolor=/"#CCCCFF/">Oil</th>
<th bgcolor=/"#CCCCFF/">Spark Plugs</th>
<th bgcolor=/"#CCCCFF/">Total</th>
<th bgcolor=/"#CCCCFF/">Address</th>
<tr>";
for($i=0;$i<$number_of_orders;$i++){
//split up each line
$line=explode("/t",$orders[$i]);
//keep only the number of items ordered
$line[1]=intval($line[1]);
$line[2]=intval($line[2]);
$line[3]=intval($line[3]);
//output each order
echo"<tr>
<td>".$line[0]."</td>
<td align=/"right/">".$line[1]."</td>
<td align=/"right/">".$line[2]."</td>
<td align=/"right/">".$line[3]."</td>
<td align=/"right/">".$line[4]."</td>
<td>".$line[5]."</td>
</tr>";
}
echo"</table>";
?>
</body>
程序清单3-3中的代码将整个文件载入数组中,但与程序清单3-2中的例子不同,在这里使用了explode函数来分割每行,这样在开始打印前就可以再做一些处理与格式化。这个脚本输出结果如图3-6所示。
图 3-6 在用explode函数分割订单记录后,可将订单的每个部分放入不同的表格单元以便美化输出效果explode函数的原型如下所示:
array explode(string separator,string string[,int limit])
在前面一章中,在保存数据的时候使用了制表符作为定界符,因此,将按如下方式调用:
explode("/t",$orders[$i])
这个函数可以将传入的字符串分割成一个个小块。每个制表符成为两个元素之间的断点。例如,字符串:
"20:43,31st March 2008/t0 tires/t1 oil/t4 spark plugs/t$26.00/t127 Acacia St,
Springfield
将被这个函数分割成"20:43,31st March 2008"、"0 tires"、"1 oil"、"4 spark plugs"、“$26.00”以及"127 Acacia St,Springfield"。
请注意,这个函数的可选参数limit可以用来限制被返回的最大块数。
在这个例子中,并没有做太多的处理。只是在一个有顶行说明的表格中显示了各种产品的数量以及一个能够显示数量代表意义的标题行,而不是在每行中都输出tires、oil和spark plugs。
可以使用许多方法从字符串中提取数字。在这里,使用了intval函数。正如在第1章中所提过的,intval函数可以将一个字符串转化成一个整数。这个转换是相当智能化的,它可以忽略某些部分,例如,在这个例子中,标签就不能转换成数字。在下一章中,将详细介绍处理字符串的不同方法。