在遍历文件中的内容时,由于文件内容很多,最理想的方法就是分页读取文本文件中的内容。本例将介绍如何分页读取文本文件中的数据,运行结果如图11.21所示。
图11.21 分页读取文本文件
【操作步骤】
第1步,创建function.php文件,编写自定义函数msubstr(),完成对文本文件的截取操作。
<?php
//定义一个用于截取一段字符串的函数msubstr()
function msubstr($str,$start,$len){ //$str指的是字符串,$start指的是字符串的起始位置,$len指的是长度。
$strlen=$start+$len;//用$strlen存储字符串的总长度(从字符串的起始位置到字符串的总长度)
$tmpstr = "";
for($i=0;$i<$strlen;$i++){//通过for循环语句,循环读取字符串
if(ord(substr($str,$i,1))>0xa0){ //如果字符串中首个字节的ASCII序数值大于0xa0,则表示为汉字
$tmpstr.=substr($str,$i,2); //每次取出两位字符赋给变量$tmpstr,即等于一个汉字
$i++; //变量自加1
}else{ //如果不是汉字,则每次取出一位字符赋给变量$tmpstr
$tmpstr.=substr($str,$i,1);}
}
return $tmpstr; //输出字符串
}
?>
完成超长文本的分页输出需要3方面的技术:第一个方面,自定义函数。通过自定义函数读取文本文件,可以避免中文字符串出现乱码;第二个方面,字符串函数。通过strlen()函数计算字符串的长度,通过substr()函数对字符串进行截取;第三个方面,文件系统函数。通过file_get_contents()函数读取文本文件中的数据。
第2步,创建index.php文件,首先通过文件系统函数file_get_contents()读取整个文件的内容,然后调用自定义函数和字符串函数完成对文件的截取操作,实现截取后内容的分页输出。
<div id="synopsis">
<!--创建div标签,用于获取js文件中返回的分页结果-->
<?php
include("function.php");
//读取超长文本中的数据,实现超长文本中数据的分页显示
if($_GET['page']){
$counter=file_get_contents("data.txt");
$length=strlen($counter);
$page_count=ceil($length/800);
$c=msubstr($counter,0,($_GET['page']-1)*800);
$c1=msubstr($counter,0,$_GET['page']*800);
echo "<p>".substr($c1,strlen($c),strlen($c1)-strlen($c))."</p>";
}
?>
<!--设置超长文本分页显示的超级连接-->
<p>第<?php echo $_GET['page'];?>页 共<?php echo $page_count;?>页</p>
<p>
<?php
if($_GET['page']!=1){
?>
<!--调用no_refurbish_pagination函数,实现无刷新的分页输出-->
<a href="#" onclick='return no_refurbish_pagination("index_ok.php?page=1")'>首页</a> <a href="#" onclick='return no_refurbish_pagination("index_ok.php?page=<?php echo $_GET['page']-1;?>")'>上一页</a>
<?php
}
if($_GET['page']<$page_count){
?>
<a href="#" onClick="return no_refurbish_pagination('index_ok.php?page=<?php echo $_GET['page']+1;?>')">下一页</a> <a href="#" onclick='return no_refurbish_pagination("index_ok.php?page=<?php echo $page_count;?>")'>尾页</a>
<?php
}
?>
</p>
</div>
第3步,创建index_ok.php文件,实现数据的无刷新分页。index_ok.php中的内容与index.php中<div id="synopsis">包含的内容相同。
第4步,创建Javascript脚本文件discuss.js。通过Ajax实现无刷新的操作。
var xmlHttp = false;
try {
xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e2) {}
}
if (!xmlHttp && typeof XMLHttpRequest != "undefined") {
try{
xmlHttp = new XMLHttpRequest();
}catch(e3){ xmlHttp = false;}
}
//使用XMLHttpRequest对象创建异步HTTP请求
function no_refurbish_pagination(url){ //创建自定义函数,获取传递的参数
xmlHttp.open('get',url,true); //根据传递的参数,通过get方法,执行另外一个实现分页功能的文件
xmlHttp.onreadystatechange = function(){
if(xmlHttp.readystate == 4 && xmlHttp.status == 200){ //将结果返回到div标签synopsis中
document.getElementById("synopsis").innerHTML = xmlHttp.responseText;
}
}
xmlHttp.send(null);
}
在本例中不但实现了文本文件内容的分页输出,而且是无刷新分页输出。具体操作通过Javascript脚本文件discuss.js和index_ok.php完成。