一起学习用PHP读取文件的正确方法
fopen 方法可能是以前的 C 和 C++ 程序员最熟悉的,因为如果您使用过这些语言,那么它们或多或少都是您已掌握多年的工具。对于这些方法中的任何一种,通过使用 fopen(用于读取数据的函数)的标准方法打开文件,然后使用 fclose 关闭文件,如清单 1 所示。
清单1:用fgets打开并读取文件
$file_handle = fopen("myfile", "r");
while (!feof($file_handle)) {
$line = fgets($file_handle);
echo $line;
}
fclose($file_handle);
虽然大多数具有多年编程经验的程序员都熟悉这些函数,但是让我对这些函数进行分解。有效地执行以下步骤:
1、打开文件。$file_handle 存储了一个对文件本身的引用。
2、检查您是否已到达文件的末尾。
3、继续读取文件,直至到达文件末尾,边读取边打印每行。
4、关闭文件。
记住这些步骤,我将回顾在这里使用的每个文件函数。
fopen
fopen 函数将创建与文件的连接。我之所以说“创建连接”,是因为除了打开文件之外,fopen 还可以打开一个 URL:
$fh = fopen("http://127.0.0.1/", "r");
这行代码将创建一个与以上页面的连接,并允许您开始像读取一个本地文件一样读取它。
注: fopen 中使用的 “r” 将指示文件以只读方式打开。由于将数据写入文件不在本文的讨论范围内,因此我将不列出所有其他选项。但是,如果是从二进制文件读取以获得跨平台兼容性,则应当将 “r” 更改为 “rb”。稍后您将看到这样的示例。
feof
feof 命令将检测您是否已经读到文件的末尾并返回 True 或 False。清单 1 中的循环将继续执行,直至您达到文件“myfile”的末尾。注:如果读取的是 URL 并且套接字由于不再有任何数据可以读取而超时,则 feof 也将返回 False。
fclose
向前跳至清单 1 的末尾,fclose 将实现与 fopen 相反的功能:它将关闭指向文件或 URL 的连接。执行此函数后,您将不再能够从文件或套接字中读取任何信息。
fgets
在清单 1 中回跳几行,您就到达了文件处理的核心:实际读取文件。fgets 函数是处理第一个示例的首选武器。它将从文件中提取一行数据并将其作为字符串返回。在那之后,您可以打印或者以别的方式处理数据。清单 1 中的示例将精细地打印整个文件。
如果决定限制处理数据块的大小,您可以将一个参数添加到 fgets 中限制最大行长度。例如,使用以下代码将行长度限制为 80 个字符:
$string = fgets($file_handle, 81);
回想 C 中的“”字符串末尾终止符,将长度设为比实际所需值大一的数字。因而,如果需要 80 个字符,则以上示例使用 81。应养成以下习惯:只要对此函数使用行限制,就添加该额外字符。
fread
fgets 函数是多个文件读取函数中惟一一个可用的。它是一个更常用的函数,因为逐行解析通常会有意义。事实上,几个其他函数也可以提供类似功能。但是,您并非总是需要逐行解析。
这时就需要使用 fread。
http://www.111cn.net/?action/viewspace/itemid/29112.html
例如:输入7,打印 七;123,打印 一百二十三;142505588,打印 一亿四千二百五十万五千五百八十八 1.如果一个方法可静态化,就对它做静态声明。速率可提升至4倍。 2.echo 比 print 快。 3.使用echo的多重参数(译注:指用逗号而不是句点)代替字符串连接。 4.在执行for循环之前确定最大循环数,不要每循环一次都计算最大值。 5.注销那些不用的变量尤其是大数组,以便释放内存。 6.尽量避免使用__get,__set,__autoload。 7.require_once()代价昂贵。 8.在包含文件时使用完整路径,解析操作系统路径所需的时间会更少。 9.如果你想知道脚本开始执行(译注:即服务器端收到客户端请求)的时刻,使用$_SERVER[‘REQUEST_TIME’]要好于time()。 10.函数代替正则表达式完成相同功能。 11.str_replace函数比preg_replace函数快,但strtr函数的效率是str_replace函数的四倍。 12.如果一个字符串替换函数,可接受数组或字符作为参数,并且参数长度不太长,那么可以考虑额外写一段替换代码,使得每次传递参数是一个字符,而不是只写一行代码接受数组作为查询和替换的参数。 13.使用选择分支语句(译注:即switch case)好于使用多个if,else if语句。 14.用@屏蔽错误消息的做法非常低效。 15.打开apache的mod_deflate模块。 16.数据库连接当使用完毕时应关掉。 17.$row[‘id’]的效率是$row[id]的7倍。 18.错误消息代价昂贵。 19.尽量不要在for循环中使用函数,比如for ($x=0; $x < count($array); $x)每循环一次都会调用count()函数。 20.在方法中递增局部变量,速度是最快的。几乎与在函数中调用局部变量的速度相当。 21.递增一个全局变量要比递增一个局部变量慢2倍。 22.递增一个对象属性(如:$this->prop++)要比递增一个局部变量慢3倍。 23.递增一个未预定义的局部变量要比递增一个预定义的局部变量慢9至10倍。 24.仅定义一个局部变量而没在函数中调用它,同样会减慢速度(其程度相当于递增一个局部变量)。PHP大概会检查看是否存在全局变量。 25.方法调用看来与类中定义的方法的数量无关,因为我(在测试方法之前和之后都)添加了10个方法,但性能上没有变化。 26.派生类中的方法运行起来要快于在基类中定义的同样的方法。 27.调用带有一个参数的空函数,其花费的时间相当于执行7至8次的局部变量递增操作。类似的方法调用所花费的时间接近于15次的局部变量递增操作。 28.用单引号代替双引号来包含字符串,这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会。当然,只有当你不需要在字符串中包含变量时才可以这么做。 29.输出多个字符串时,用逗号代替句点来分隔字符串,速度更快。注意:只有echo能这么做,它是一种可以把多个字符串当作参数的“函数”(译注:PHP手册中说echo是语言结构,不是真正的函数,故把函数加上了双引号)。 30.Apache解析一个PHP脚本的时间要比解析一个静态HTML页面慢2至10倍。尽量多用静态HTML页面,少用脚本。 31.除非脚本可以缓存,否则每次调用时都会重新编译一次。引入一套PHP缓存机制通常可以提升25%至100%的性能,以免除编译开销。 32.尽量做缓存,可使用memcached。memcached是一款高性能的内存对象缓存系统,可用来加速动态Web应用程序,减轻数据库负载。对运算码 (OP code)的缓存很有用,使得脚本不必为每个请求做重新编译。 33.当操作字符串并需要检验其长度是否满足某种要求时,你想当然地会使用strlen()函数。此函数执行起来相当快,因为它不做任何计算,只返回在 zval 结构(C的内置数据结构,用于存储PHP变量)中存储的已知字符串长度。但是,由于strlen()是函数,多多少少会有些慢,因为函数调用会经过诸多步 骤,如字母小写化(译注:指函数名小写化,PHP不区分函数名大小写)、哈希查找,会跟随被调用的函数一起执行。在某些情况下,你可以使用isset() 技巧加速执行你的代码。 (举例如下) 调用isset()恰巧比strlen()快,因为与后者不同的是,isset()作为一种语言结构,意味着它的执行不需要函数查找和字母小写化。也就是说,实际上在检验字符串长度的顶层代码中你没有花太多开销。 Jupyter Notebook读取csv文件出现的问题及解决 php无刷新利用iframe实现页面无刷新上传文件(1/2) ant design中upload组件上传大文件,显示进度条进度的实例
自己花了一个晚上才搞出来- -!$num = "142505588";//九位数
/*
这两个函数重写了,采用了内置函数和数组。
function del0($num) //去掉数字段前面的0
{
$flag = 0;
$str = '''';
for($i=0; $i<strlen($num); $i++)
{
if($num{$i} == ''0'' && $flag == 0)
continue;
elseif($num{$i} != ''0'')
{
$str = $str.$num{$i};
$flag = 1;
}else{
$str = $str.$num{$i};
}
}
return $str;
}
function n2c($x) //单个数字变汉字
{
switch($x)
{
case ''0'': $ch = ''零''; break;
case ''1'': $ch = ''一''; break;
case ''2'': $ch = ''二''; break;
http://www.111cn.net/html/00/54500_itemid_29653.html
一个六位数,当分别用2,3,4,5,6乘它后,得到的五个乘积都是一个六位数,而且这得到的五个数是由原来六个数字组成,只是顺序改变了!
求高手帮助解决下!
---------------
貌似大家都默认了一个现象
http://www.111cn.net/viewthread.php?tid=54377&page=5#pid394850
之前提出的一个假设 貌似大家做算法的时候都不考虑这种情况的存在可能 如果哪位有论证过这种假设不成立或者楼主的题目本身就默认不考虑这种假设 请大侠们说明一下
如果没有论证或者题目没有明确说明不考虑这种假设 算法设计再好也是不合题意的无效算法
------------------------
写了两种算法:
第一种思路是判断相乘的数的各个位之和是否相等,不过效率不太好。
第二种算法换了一种思路,用了字符反方向验证,因为正向会有一部分高位的不必要的运算。代码很简洁,效率很不错,附上代码:
第一种算法,判断各个位数之和:
===========================================================
第二种算法,字符反方向查询:
第一个算法在我的PE2140@2.66GHz上需要440ms,第二种只需要180ms。
---------------------------------
我之前提过这个问题了http://www.111cn.net/bbs/thread-54377-2-1.html
解决的方法有一个:
得出每一位,逐个位排除.
如得两个位数相同,则两个同时删除或更改.
比如:
''123451''和''123456''
逐位删除或更改的话,剩下的一位就不等了.
----------------------------------
for($i = 100000;$i < 166667;$i++) //数的范围
{
....
for($ii=2;$ii<7;$ii++) // 2-6的倍数
{
.....
for($j=0;$j<6;$j++) //数的个数
{
if(strpos($i,substr($i*$ii,$j,
simpleXML是php5的新特性。RSS是如今比较流行的哈。这里提供一个简单的演示,来获取php.net的RSS。
复制内容到剪贴板代码:
<?
$cache="phpnews.xml";
$rssurl="http://www.php.net/news.rss";
header("content-type:text/html;charset=utf-8");
if( file_exists("$cache") )
{
$m=filemtime("$cache");
$n=time();
if($n-$m>10800)
{
$rss=simplexml_load_file("$rssurl");
$rss->asXML("$cache");
}
else
$rss=simplexml_load_file("$cache");
}
else
{
$rss=simplexml_load_file("$rssurl");
$rss->asXML("$cache");
}
foreach($rss->item as $item)
print "<a href="$item->link" target=_blank> $item->title </a><br>n";
?>
if (strlen($foo) < 5) { echo “Foo is too short”; }
(与下面的技巧做比较)
if (!isset($foo{5})) { echo “Foo is too short”; }相关文章