PHP foreach

php的foreach 循环,操作的只是数组的拷贝,

如果想通过foreach 改变数组的值,则可以在$value前加上 & ,

这样$value是引用赋值,改变它就能改变数组。

-----------------------------------------

以上是今天之前对foreach的认知,我以为这就是全部,

然而还是太年轻...

如果我用foreach操作同一个数组2次(或以上),

并且第一次带上了 & ,每次$value 的取名都一样,那么问题来了:

 1 <?php
 2
 3 $arr = array(‘dog‘,‘duck‘,‘cat‘,‘pig‘);
 4
 5
 6 foreach($arr as &$v){
 7     $v = ‘buy ‘.$v;
 8 }
 9 // unset($v);
10
11 foreach($arr as $v){
12     echo $v.‘<br />‘;
13 }
14
15 print_r($arr);

而如果把第11,12行的$v 换成其他名字,比如 $a(只要不是$v),

运行的结果便是如预期的:

究其原因,在官方里有写:

所以,当把第九行的注释去掉之后,再次运行的结果便第二次执行所示,完美。

今天被自己坑了一把,以后如果foreach带引用赋值的,在循环结束之后,千万记得unset($value).

时间: 2024-08-10 00:36:57

PHP foreach的相关文章

Typescript : 遍历Array的方法:for, forEach, every等

方法一,for-of 这个貌似是最常用的方法,angular 2中HTML语法绑定也是要的这种语法. let someArray = [1, "string", false]; for (let entry of someArray) { console.log(entry); // 1, "string", false } for-in 官方文档上强调了for-in和for-of的区别: let list = [4, 5, 6]; for (let i in li

嘿!@野兽,你的ng api 掉了 - - angular.forEach

@野兽的 ng api 学习 -- angular.forEach angular.forEach 调用迭代器函数取每一项目标的集合,它可以是一个对象或数组.迭代器函数与迭代器(value.key)一起调用,其中值是一个对象属性或数组元素的值,而数组元素是对象属性的关键或数组元素索引.为函数指定一个可选的上下文. 格式:angular.forEach(obj,iterator,[context]); obj:遍历的对象 iterator:迭代器 [content]: 对象为迭代器函数的上下文(t

【java8】慎用java8的foreach循环

虽然java8出来很久了,但是之前用的一直也不多,最近正好学习了java8,推荐一本书还是不错的<写给大忙人看的javase8>.因为学习了Java8,所以只要能用到的地方都会去用,尤其是Java8的Stream,感觉用起来觉得很方便,因为点点点就出来了,而且代码那么简洁.现在开始慢慢深入了解java8,发现很多东西不能看表面. 比如常规遍历一个集合,下面给出例子: 1.首先遍历一个List 方式1.一开始是这样的: public static void test1(List<Strin

php中的foreach使用

foreach语句是php用来遍历数组的一种方法,主要有两种格式: 第一种:foreach (array_name as $value) 例1: <?php$arr=array(1,2,3);foreach ($arr as $key =>$value){ echo "Value: " . $value . "<br />";}?> 运行结果: 第二种:foreach  (array_name as $key => $value)

c# winform 循环遍历界面上的所有控件,foreach,Controls,AllowDrop

foreach (System.Windows.Forms.Control control in this.groupBox2.Controls)//遍历groupBox2上的所有控件 { if (control is System.Windows.Forms.PictureBox) { System.Windows.Forms.PictureBox pb = (System.Windows.Forms.PictureBox)control; pb.AllowDrop = true; } if

java中for循环的特殊:foreach的使用

首先格式是: for(元素类型 元素变量:遍历对象){ 执行的代码 } 例如: public class Test { public static void main(String[] args) { // 定义一个整型数组,保存成绩信息 int[] scores = { 89, 72, 64, 58, 93 }; // 对Arrays类对数组进行排序 Arrays.sort(scores); // 使用foreach遍历输出数组中的元素 for ( int sco:scores ) { Sys

map() 和 forEach() 区别 兼容写法

兼容写法: 不管是forEach还是map在IE6-8下都不兼容(不兼容的情况下在Array.prototype上没有这两个方法),那么需要我们自己封装一个都兼容的方法,代码如下: /** * forEach遍历数组 * @param callback [function] 回调函数: * @param context [object] 上下文: */ Array.prototype.myForEach = function myForEach(callback,context){ contex

【java8】为java8的foreach正名

首先为自己没有经过严格测试得出的错误结论感到抱歉,原博文,测试完感觉自己发现了一个新bug,后来思前想后觉得不应该是这样的,如果效率差的这么多,jdk的开发人员会不去优化它吗,但是怎么重复测试任然得到一样的结果,非常疑惑. 我觉得应该是测试方法出问题了,可是怎么也想不到原因,后来了解到jmh,深入研究了一番,觉得jmh的测试值得借鉴,jmh在测试的时候都会先经过预热几遍要测试的代码,示例如下: public static void main(String[] args) throws Runne

在for、foreach循环体中添加数组元素

在开发工作中遇到这样一种情形,需要在循环体中动态向遍历中的数组添加元素并在当前循环遍历中使用数组的全部元素. 首先使用foreach循环来遍历数组,将代码简化抽象如下: $arr = array(1, 2, 3, 4, 5, 6, 7, 8); foreach($arr as $v) { if($v % 2 == 0) $arr[] = 11; echo $v . ' '; } 结果只打印出数组原来已有元素,在循环体中动态添加的元素并没有打印出来. 后来改用for循环,coding如下: $ar

foreach和foreachPartition

转载请标明出处http://www.cnblogs.com/haozhengfei/p/6776fe93f754daf60d00d2cb509422a1.html foreach和foreachPartition--Action类算子 代码示例