php 中遍历一个array时可以使用for或foreach,foreach的语法为:foreach ($arr as $k => $v)。遍历数组,把index赋给$k,数组的值赋给$v,那么此处的赋值是传值还是传引用呢。
php中foreach()的用法
foreach()有两种用法:
1:
代码如下 |
复制代码 |
foreach(array_name as $value)
{
statement;
} |
这里的array_name是你要遍历的数组名,每次循环中,array_name数组的当前元素的值被赋给$value,并且数组内部的下标向下移一步,也就是下次循环回得到下一个元素。
2:
代码如下 |
复制代码 |
foreach(array_name as $key => $value)
{
statement;
} |
这里跟第一种方法的区别就是多了个$key,也就是除了把当前元素的值赋给$value外,当前元素的键值也会在每次循环中被赋给变量$key。键值可以是下标值,也可以是字符串。比如book[0]=1中的“0”,book[id]="001"中的“id”.
看下面的例子:
代码如下 |
复制代码 |
$arr = array(
array('id' => 1, 'name' => 'name1'),
array('id' => 2, 'name' => 'name2'),
);
foreach ($arr as $obj) {
$obj['id'] = $obj['id'];
$obj['name'] = $obj['name'] . '-modify';
}
print_r($arr); //输出的结果
Array(
[0] => Array (
[id] => 1
[name] => name1
)
[1] => Array(
[id] => 2
[name] => name2
)
)
|
观察可以发现在foreach循环中对$arr操作并没有影响到$arr的元素,所以这里的赋值是传值而不是传引用。那如果需要修改$arr中元素的值该怎么办呢?可以在变量前面加一个”&”符号,例如:
代码如下 |
复制代码 |
foreach ($arr as &$obj) {
$obj['id'] = $obj['id'];
$obj['name'] = $obj['name'] . '-modify';
}
|
再看另外一个例子,array里面存放的是object,
代码如下 |
复制代码 |
$arr = array(
(object)(array('id' => 1, 'name' => 'name1')),
(object)(array('id' => 2, 'name' => 'name2')),
);
foreach ($arr as $obj) {
$obj->name = $obj->name . '-modify';
}
print_r($arr); //输出的结果
Array
(
[0] => stdClass Object
(
[id] => 1
[name] => name1-modify
)
[1] => stdClass Object
(
[id] => 2
[name] => name2-modify
)
)
|
此时可以看到原始数组中的object对象已经修改了,所以这里的赋值又是传引用而不是传值
综合上述,得出的结论:如果数组里面存放的是普通类型的元素就是采用传值的方式,存放对象类型元素采用的方式为传地址。
empty与isset在php中一个是为空,另一个判断是是否为一个存在的变量了,下面小编来给各位同学介绍php中empty与isset区别,欢迎各位同学进入参考。
empty是判断变量值是非空或非零的值。对应空定义包括:“”(空字符串)、0、“0”、NULL、FALSE、array()和$var(只声明但未赋值)。也就是说当变量值为上述这些,empty返回TRUE,其他的都返回FALSE。
isset是检测变量是否设置,并且不是 NULL。变量设置可以从几个方面来说。1:最简单的就是变量是否先声明和赋值;2:array中是否存在对应的index或key;3:object中是否存在对应的属性。
从上面的两个function定义可以看到,在某些情况下,两者可以公用,但其区别还是很大的。另外它们都只能检测变量,检测任何非变量的东西都将导致解析错误。例如直接检查另一个function的返回值(empty(otherFunction())),你将看到“Fatal error: Can’t use function return value in write context in”这样的错误。
另外isset可以一次检查多个变量,例如:isset($var1, $var2, $var3),当这三个值分别的isset都为TRUE结果为TRUE,否则结果为FALSE。
测试代码:
代码如下 |
复制代码 |
$sep = "<br />";
echo 'test undeclared var empty : ';
var_dump(empty($var)); // TRUE
echo $sep . 'test undeclared var isset : ';
var_dump(isset($var)); // FALSE
$var;
echo $sep . 'test declared var but no set value empty : ';
var_dump(empty($var)); // TRUE
echo $sep . 'test declared var but no set value isset : ';
var_dump(isset($var)); // FALSE, 变量申明未赋值,默认值为NULL
$var = NULL;
echo $sep . 'test declared var and set value NULL empty : ';
var_dump(empty($var)); // TRUE
echo $sep . 'test declared var and set value NULL isset : ';
var_dump(isset($var)); // FALSE, 变量申明赋值为NULL
$var1 = ''; $var2 = '0'; $var3 = 0; $var4 = FALSE; $var5 = array();
echo $sep . 'test '' empty : ';
var_dump(empty($var1)); // TRUE
echo $sep . 'test '0' empty : ';
var_dump(empty($var2)); // TRUE
echo $sep . 'test 0 empty : ';
var_dump(empty($var3)); // TRUE
echo $sep . 'test FALSE empty : ';
var_dump(empty($var4)); // TRUE
echo $sep . 'test array() empty : ';
var_dump(empty($var5)); // TRUE
echo $sep . 'test '', '0', 0, FALSE, array() isset : ';
var_dump(isset($var1, $var2, $var3, $var4, $var5)); // TRUE, 变量申明并赋值为空字符串
|
输出的结果为:
代码如下 |
复制代码 |
test undeclared var empty : bool(true)
test undeclared var isset : bool(false)
test declared var but no set value empty : bool(true)
test declared var but no set value isset : bool(false)
test declared var and set value NULL empty : bool(true)
test declared var and set value NULL isset : bool(false)
test '' empty : bool(true)
test '0' empty : bool(true)
test 0 empty : bool(true)
test FALSE empty : bool(true)
test array() empty : bool(true)
test '', '0', 0, FALSE, array() isset : bool(true)
|
比如检测 $id 变量,当 $id=0 时,用empty() 和 isset() 来检测变量 $id 是否已经配置,两都将返回不同的值—— empty() 认为没有配置,isset() 能够取得 $id 的值:
代码如下 |
复制代码 |
$id=0;
empty($id)?print "It's empty .":print "It's $id .";
//结果:It's empty .
print "<br>";
!isset($id)?print "It's empty .":print "It's $id .";
//结果:It's 0 .
|
这意味着,我们在使用变量处理函数时,当该变量可能出现0的值,使用 empty() 要小心,这个时候用 isset 取代它更明智一些。
当一个php页面的 URL 尾部参数出现 id=0 时(比如:test.php?id=0),试比较:
代码如下 |
复制代码 |
if(empty($id)) $id=1; - 若 id=0 ,id 也会为1
if(!isset($id)) $id=1; - 若 id=0 ,id 不会为1
|
可分开运行以下代码检测上述推断:
代码如下 |
复制代码 |
if(empty($id)) $id=1;
print $id; // 得到 1
if(!isset($id)) $id=1;
print $id; //得到 0
|
在php中header函数是一个很常用的函数了,它可以跳转也可以发送各种状态代码,如404,301或者页面编码,下面我来总结一下header函数常用方法。
代码如下 |
复制代码 |
<?php
// fix 404 pages:
header('HTTP/1.1 200 OK');
// set 404 header:
header('HTTP/1.1 404 Not Found');
// set Moved Permanently header ('good for redrictions')
// use with location header
header('HTTP/1.1 301 Moved Permanently');
// redirect to a new location:
header('Location: http://www.111cn.net/');
// redrict with delay:
header('Refresh: 10; url=http://www.111cn.net/');
//print You will be redirected in 10 seconds;
// you could also use the HTML syntax:// <meta http-equiv="refresh" content="10;http://www.111cn.net/ />
// override X-Powered-By: PHP:
header('X-Powered-By: PHP/4.4.0');
header('X-Powered-By: Brain/0.6b');
// content language ('en = English')
header('Content-language: en');
// last modified ('good for caching')
$time = time('') – 60; // or filemtime('$fn'), etc
header('Last-Modified: .gmdate("D, d M Y H:i:s, ' . $time . '"). GMT');
// header for telling the browser that the content
// did not get changed
header('HTTP/1.1 304 Not Modified');
// set content length ('good for caching'):
header('Content-Length: 1234');
// Headers for an download:
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="example.zip"');
header('Content-Transfer-Encoding: binary');
// load the file to send:readfile('example.zip');
// Disable caching of the current document:
header('Cache-Control: no-cache, no-store, max-age=0, must-revalidate');
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
// Date in the pastheader('Pragma: no-cache');
// plain text file
header('Content-Type: image/jpeg');
// JPG picture
header('Content-Type: application/zip');
// ZIP file
header('Content-Type: application/pdf');
// PDF file
header('Content-Type: audio/mpeg');
// Audio MPEG ('MP3,…') file
header('Content-Type: application/x-shockwave-flash');
// Flash animation// show sign in box
header('HTTP/1.1 401 Unauthorized');
header('WWW-Authenticate: Basic realm="Top Secret"');
//print Text that will be displayed if the user hits cancel or ;
//print enters wrong login data;
// set content type:
header('Content-Type: text/html; charset=iso-8859-1');
header('Content-Type: text/html; charset=utf-8');
header('Content-Type: text/plain');
php页面为utf编码
header("Content-type: text/html; charset=utf-8");
php页面为gbk编码
header("Content-type: text/html; charset=gb2312");
php页面为big5编码
header("Content-type: text/html; charset=big5");
Header( "HTTP/1.1 301 Moved Permanently" ) ;
Header( "Location: www.111cn.net" );
|
下面我们以.txt文件为实例来介绍php读取本地文件的函数,读取文件我们可以利用fopen或file_get_contents来读取,file_get_contents更简单而fopen需要fread配合才可以显示读出的内容。
1.首先来介绍一下fopen()函数
下面我们给出了一个直接打开本地文件的代码demo,必要的地方我们都已经加上了注释:
代码如下 |
复制代码 |
//直接打开一个本地文件的实例代码
<?php
//假若我们本地的文件是一个名为xmlas.txt的文本
$filedemo = "xmlas.txt";
$fpdemo = fopen($filedemo,"r");
if ($fpdemo){
while(!feof($fpdemo)){
//1000读取的字符数
$datademo = fread($fpdemo, 1000);
}
fclose($fpdemo);
}
echo $datademo;
?>
|
2.使用file_get_contents() 函数将整个文件在一个字符串中输出:
假若我们的xmlas.txt文本文件中有这样一句话:现在的电影越来越没激情,想要全部高潮请看日本爱情
动作片!
那么我们file_get_contents() 函数的实例代码便如下:
代码如下 |
复制代码 |
<?php
echo file_get_contents("xmlas.txt");
//此时输出的内容便为xmlas.txt中的内容:
//现在的电影越来越没激情,想要全部高潮请看日本爱情动作片!
?>
|
3.如何读取本地的一个文件夹而不是一个单独文件:
请看下面的实例代码,在实例中我们将读取一个名为xmlas的文件夹:
代码如下 |
复制代码 |
<?php
$dirdemo = opendir('/xmlas');
while(($filedemo = readdir($dirdemo))!=false){
if ($filedemo!="." && $filedemo!="..") {
$nsdemo = explode('.', $filedemo);
echo $nsdemo[0];
}
}
closedir($dirdemo);
?>
|
4.我们还可以利用fopen来写文件
代码如下 |
复制代码 |
/**
*用fopen写入文件
*@param string $filename
*@param string $contents
*@return boolean
*/
function wirte($filename,&$contents)
{
$fp=fopen($filename,"wb");
if($fp)
{
flock($fp,LOCK_EX);//同一时间锁定文件,只能一个人操作
fwrite($fp,$contents);
flock($fp,LOCK_UN);//保存数据握进行解锁文件并保存
fclose($fp);
return true;
}else
{
return false;
}
}
|
这样我只要利用fopen配合fwrite就可以实现文件读写了。
注意:l打开文件
在打开文件文件之前,我们需要知道这个文件的路径,以及此文件是否存在。
用$_SERVER[“DOCUMENT_ROOT”]内置全局变量,来获得站点的相对路径。如下:
代码如下 |
复制代码 |
$root = $_SERVER[“DOCUMENT_ROOT”];
|
在用函数file_exists()来检测文件是否存在。如下:
代码如下 |
复制代码 |
If(!file_exists("$root/order.txt")){echo ‘文件不存在’;}
|
这样可能更合理更实用哦。
解决PHP Header下载文件在IE文件名中文乱码有两种常见的,一种是是把页面编码改成utf8,另一种是对中文url进入urlencode编码就可以解决了。
解决方案一(我的页面是utf-8编码):
代码如下 |
复制代码 |
$filename = "中文.txt";
$ua = $_SERVER["HTTP_USER_AGENT"];
$encoded_filename = urlencode($filename);
$encoded_filename = str_replace("+", "%20", $encoded_filename);
header('Content-Type: application/octet-stream');
if (preg_match("/MSIE/", $ua)) {
header('Content-Disposition: attachment; filename="' . $encoded_filename . '"');
} else if (preg_match("/Firefox/", $ua)) {
header('Content-Disposition: attachment; filename*="utf8''' . $filename . '"');
} else {
header('Content-Disposition: attachment; filename="' . $filename . '"');
}
|
解决方法二
将文件名先urlencode一下再放入header,如下。
代码如下:
代码如下 |
复制代码 |
<?php
$file_name = urlencode($_REQUEST['filename']);
header("Pragma: public"); header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Content-Type: application/force-download");
header('Content-Type: application/vnd.ms-excel; charset=utf-8');
header("Content-Transfer-Encoding: binary");
header('Content-Disposition: attachment; filename='.$file_name);
echo stripslashes($_REQUEST['content']);
?> |
标签:[!--infotagslink--]