先来看ob_start用法
使用PHP ob_start()函数打开browser的cache,这样可以保证cache的内容在你调用flush(),ob_end_flush()(或程序执行完毕)之前不会被输出
代码如下 | 复制代码 |
<?php ob_start(); //打开缓冲区 ?> |
PHP ob_start()函数一个很大的特点;也可以使用ob_start的参数,在cache被写入后,然后自动运行命令,比如ob_start(”ob_gzhandler”);而我们最常用的做法是用ob_get_contents()得到cache中的内容
面的代码是一个压缩网页的例子,我 们利用ob_gzip函数,使用ob_start将输出内容压缩后放到“缓冲区”后再输出。
代码如下 | 复制代码 |
//启用压缩 |
例
代码如下 | 复制代码 |
<?php |
开始运行foreach第一次,这时 $key='a';$value='网上';
输出后第二次运行 这时 $key='b';$value='朋友';
输出后第三次运行 这时 $key='c';$value='其它';
这时数组已经到了尾部,退出循环
例
代码如下 | 复制代码 |
<? 1,"two"=>2,"three"=>3,"four"=>4); $array2=array(5,6,7,8); ?> 结果是 $array1=array("one"=>1,”two”=>2,”three”=>3,”four”=>4); $array2=array(5,6,7,8); ?> |
为了便于理解,我们假定这里的$array是一个一维的相关数组,$key是数组的索引,$value是这个索引的值,它们的名字可以随意,之所以叫$key和$value是为了便于理解。为了能让你更好的理解foreach的工作过程,我们来创建一个数组:
$array = array('first'=>'ibm','second','hp');
现在我们模拟PHP服务用foreach对$array进行遍历:
代码如下 | 复制代码 |
foreach ($array as $key=>$value) { echo $key.'=>'$value; } |
第一次循环,$key = 'first',$value = 'ibm',这个时候,实际foreach对$array执行了一个我们看不见的操作
foreach循环中使用引用要注意
发现了一个容易出错,但是不懂得原理却解释不明白的问题
代码如下 | 复制代码 |
foreach ($array as &$row) { $row = explode(‘/’, $row); } foreach ($array as $row) { //do something } |
这么写,在第二个循环会出逻辑错误,加入第二个循环中do something的地方是输出$row,循环到最后一个的时候的输出是倒数第二个元素,而不是最后一个
要这么写
代码如下 | 复制代码 |
foreach ($array as &$row) { 或者第一个循环这么写 foreach ($array as $key => $row) { |
代码如下 | 复制代码 |
<? // Start snipit 1 $sql = "SELECT * from <table>"; while ($row = mysql_fetch_assoc($result)) { mysql_data_seek($result, 0); //关键是这儿 while ($row = mysql_fetch_assoc($result)) { |
定义和用法
mysql_data_seek() 函数移动内部结果的指针。
语法
mysql_data_seek(data,row)参数 描述
data 必需。返回类型为 resource 的结果集。该结果集从 mysql_query() 的调用中得到。
row 必需。想要设定的新的结果集指针的行数。0 指示第一个记录。
说明
mysql_data_seek() 将 data 参数指定的 MySQL 结果内部的行指针移动到指定的行号。
接着调用 mysql_fetch_row() 将返回那一行。
row 从 0 开始。row 的取值范围应该从 0 到 mysql_num_rows - 1。
但是如果结果集为空(mysql_num_rows() == 0),要将指针移动到 0 会失败并发出 E_WARNING 级的错误,mysql_data_seek() 将返回 false。
返回值
如果成功则返回 true,失败则返回 false。
php中is_dir,is_file,file_exists函数性能分析
php,is_dir,is_file,file_exists
很显然file_exists是受了asp的影响,因为asp不但有fileExists还有folderExists,driverExists,那么PHP中file_exists是什么意思呢?
PHP的 file_exists = is_dir + is_file
它既可以判断文件是否存在,又可以判断目录是否存在。但这样一个全面的函数执行效率非常低,就像asp中request不指定是form,还是get,cookies,所以结论是:
◦如果要判断目录是否存在,请用独立函数 is_dir(directory)
◦如果要判断文件是否存在,请用独立函数 is_file(filepath)
--------------------------------------------------------------------------------------
is_file 只判断文件是否存在;
file_exists 判断文件是否存在或者是目录是否存在;
is_dir 判断目录是否存在;
查看手册,虽然这两个函数的结果都会被缓存,但是is_file却快了N倍。
还有一个值得注意的:
文件存在的情况下,is_file比file_exists要快N倍;
文件不存在的情况下,is_file比file_exists要慢;
结论是,file_exits函数并不会因为该文件是否真的存在而影响速度,但是is_file影响就大了
看了这篇PHP中file_exists与is_file,is_dir的区别的说法基本明白,PHP的 file_exists = is_dir + is_file。
写程序验证一下:
分别执行1000次,记录所需时间。
代码如下 | 复制代码 |
文件存在(当前目录) 文件存在(绝对路径3层/www/hx/a/) 文件存在(绝对路径5层/www/hx/a/b/c/) 文件不存在(当前目录) 文件不存在(绝对路径5层/www/hx/a/b/c/) 目录存在 |
is_file($file)
file_exists($file)
当$file是目录时,is_file返回false,file_exists返回true
文件存在的情况下,is_file比file_exists要快得多;
要检测文件所在的目录越深,速度差越多,但至少快4倍。
文件不存在的情况下,is_file比file_exists要慢一点点,但可以忽略不计。
目录存在的情况下,is_dir比file_exists要快得多;
目录不存在的情况下,is_dir比file_exists要慢一点点,但可以忽略不计。
结论:
如果要判断文件是否存在,用函数 is_file(),
如果要判断目录是否存在,用函数 is_dir(),
好像没地方需要用file_exists了,不确定传入的参数是文件还是目录的时候用?
如array_multisort($a,$b),$a,$b是两个数组,如果排序之后,$a数组的第3个元素被排到了第一位,那么$b的第三个元素不管他在$b中的大小都会排在第一位。看看下边的程序运行结果:
代码如下 | 复制代码 |
<?php |
运行结果:
代码如下 | 复制代码 |
array(5) { [0]=> int(0) [1]=> int(10) [2]=> int(50) [3]=> int(80) [4]=> int(100) } |
自定义函数实现排序
代码如下 | 复制代码 |
$arr = array( |
这时$arr就是以order大小排序了,呵呵……