一 foreach的语法介绍

    PHP 4以上的版本包括了 foreach 结构,这只是一种遍历数组简便方法。foreach 仅能用于数组,当试图将其用于其它数据类型或者一个未初始化的变量时会产生错误。有两种语法,第二种是第一种的有用的扩展。

  1. foreach(array_expression as $value) statement
  2. foreach(array_expression as $key => $value) statement

第一种格式遍历给定的 array_expression 数组。每次循环中,当前单元的值被赋给 $value 并且数组内部的指针向前移一步(因此下一次循环中将会得到下一个单元)。

    第二种格式做同样的事,只是除了当前单元的值以外,键值也会在每次循环中被赋给变量 $key。看下面代码:

  1. $arr = array("1"=>"111","2"=>"222","3"=>"333");
  2. foreach($arr as $key=>$value)
  3. {
  4. echo $key."=>".$value."\n";
  5. }
  6. 结果如下:
  7. 1=>111
  8. 2=>222
  9. 3=>333

键值这里可以理解为数组下标,数组元素a[2]的下标就是2.

当 foreach 开始执行时,数组内部的指针会自动指向第一个单元。这意味着不需要在 foreach 循环之前调用 reset()。而while循环需要reset。下面两种代码功能完全相同。

1.用while循环

  1. $arr = array("one", "two", "three");
  2. reset ($arr);
  3. while (list(, $value) = each ($arr)) {
  4. echo "Value: $value<br>\n";
  5. }

2.用foreach

  1. foreach ($arr as $value) {
  2. echo "Value: $value<br>\n";
  3. }

此外注意 foreach 所操作的是指定数组的一个拷贝,而不是该数组本身。因此即使有 each() 的构造,原数组指针也没有变,数组单元的值也不受影响。

    foreach 不支持用“@”来禁止错误信息的能力。

二 PHP foreach 小结

     1.foreach 中使用引用的情况。

普通情况下,foreach($arr as $value)中的$arr和$value是拷贝,不受外部影响的,即

  1. $arr = array(0,1,2,3,4,5);
  2. foreach($arr as $value){
  3. $arr = array();
  4. echo $value;
  5. }

结果是:12345

但如果$arr是引用的话,情况则不同了,我们用代码来说明问题

  1. $arr = array(0,1,2,3,4,5);
  2. $arr = &$arr;
  3. foreach($arr as $value){
  4. $arr = array();
  5. echo $value;
  6. }

结果是: 0

这是因为循环用的$arr是直接指向原数据的,而不是copy了一份。

如果$value是引用,而$arr不是引用,其结果是一样的,同样$value是指向原数据的而不是copy

  1. $arr = array(0,1,2,3,4,5);
  2. foreach($arr as &$value){
  3. $arr = array();
  4. echo $value;
  5. }

结果是: 0

还有一种情况比较特殊,即是如果定义了$arr为全局变量的话,$arr也会变成引用

  1. global $arr;
  2. $arr = array(0,1,2,3,4,5);
  3. foreach($arr as $value){
  4. $arr = array();
  5. echo $value;
  6. }

结果是: 0

2. 如果两次循环一个数组,一定不能这样写

  1. foreach($arr as &$value){}
  2. foreach($arr as $value){}

这会导致第二次的循环的结果不正确(可能是php的bug吧)。可以用以下几种来代替:

  1. //solution 1
  2. foreach($arr as &$value){}
  3. unset($value);
  4. foreach($arr as $value){}
  5. //solution 2
  6. foreach($arr as &$value){}
  7. foreach($arr as &$value){}
  8. //solution 3
  9. foreach($arr as &$value){}
  10. $arr2 = $arr;
  11. foreach($arr2 as $value){}

3.防止foreach出现未定义情况,尽量这样来写foreach

  1. foreach((array)$arr as $value) {}

foreach的更多相关文章

  1. 先说IEnumerable,我们每天用的foreach你真的懂它吗?

    我们先思考几个问题: 为什么在foreach中不能修改item的值? 要实现foreach需要满足什么条件? 为什么Linq to Object中要返回IEnumerable? 接下来,先开始我们的正 ...

  2. 了解PHP中的Array数组和foreach

    1. 了解数组 PHP 中的数组实际上是一个有序映射.映射是一种把 values 关联到 keys 的类型.详细的解释可参见:PHP.net中的Array数组    . 2.例子:一般的数组 这里,我 ...

  3. 浅谈JavaScript中forEach与each

    forEach是ES5中操作数组的一种方法,主要功能是遍历数组,例如: var arr = [1,2,3,4]; arr.forEach(alert); 等价于: var arr = [1, 2, 3 ...

  4. 《ES6基础教程》之 map、forEach、filter indexOf 用法

    1,map,对数组的每个元素进行一定操作,返回一个新的数组. var oldArr = [{first_name:"Colin",last_name:"Toh" ...

  5. php foreach引用赋值

    在写代码时发现php foreach引用赋值会导致意外的行为. 代码示例: <?php $arr = array('a','b','c'); foreach($arr as $k=>&am ...

  6. JAVA中的for-each循环与迭代

    在学习java中的collection时注意到,collection层次的根接口Collection实现了Iterable<T>接口(位于java.lang包中),实现这个接口允许对象成为 ...

  7. 解决mybatis foreach 错误: Parameter '__frch_item_0' not found

    解决mybatis foreach 错误: Parameter '__frch_item_0' not found 在遍历对象的属性(是ArrayList对象)时报错: org.mybatis.spr ...

  8. PHP 的 foreach

    foreach 可以 针对 string 操作,不过会生成一个警告,并跳过该 expression, 举例: $ids = '123'; foreach ($ids as $item){ print_ ...

  9. Parallel.Foreach

    随着多核时代的到来,并行开发越来越展示出它的强大威力! 使用并行程序,充分的利用系统资源,提高程序的性能.在.net 4.0中,微软给我们提供了一个新的命名空间:System.Threading.Ta ...

随机推荐

  1. Python:版本升级

    Linux 上安装的python版本是2.6.6,不能满足我运行软件的要求,所以对python进行升级.现在要了解MySQL Fabric,需要使用Python 2.7,所以只能对现有版本进行升级了. ...

  2. ubuntu系统安装初始化脚本

    ubuntu系统安装初始化脚本 经常安装卸载ubuntu,每次系统安装完成后要安装好多软件,一个个命令输很麻烦浪费时间,一个sh文件全搞定! 1. flashplayer下载:点击这里 2. Auda ...

  3. Mellanox 8亿美元收购EZchip

    http://www.iccsz.com/site/cn/News/2015/10/08/20151008003916131771.htm Mellanox 8亿美元收购EZchip 目标电信运营商 ...

  4. BZOJ3160万径人踪灭

    Description Input & Output & Sample Input & Sample Output HINT 题解: 题意即求不连续但间隔长度对称的回文串个数. ...

  5. webgl动画小测试

    // MultiPoint.js (c) 2012 matsuda // Vertex shader program var VSHADER_SOURCE = 'attribute vec4 a_Po ...

  6. 解读ASP.NET 5 & MVC6系列(15):MvcOptions配置

    程序模型处理 IApplicationModelConvention 在MvcOptions的实例对象上,有一个ApplicationModelConventions属性(类型是:List<IA ...

  7. weblogic的集群与配置

    目录(?)[-] 1.Weblogic的集群 2.创建Weblogic集群前的规划 3.开始创建我们的Weblogic集群 1.1 创建集群的总控制端aminserver 2.2 创建集群中的节点my ...

  8. [LeetCode] Implement Trie (Prefix Tree) 实现字典树(前缀树)

    Implement a trie with insert, search, and startsWith methods. Note:You may assume that all inputs ar ...

  9. [LeetCode] Wildcard Matching 外卡匹配

    Implement wildcard pattern matching with support for '?' and '*'. '?' Matches any single character. ...

  10. 如何使用DotfuscatorPro_4.9对软件进行加密

    DotfuscatorPro_4.9可以防止你的.NET软件被反编译,可以在一定程度上防止你的软件被反编译.现在很多软件都有被反编译的现象,虽然不能做到百分百的防范,但是你至少可以先做些技术上的处理, ...