foreach ($arr as &$value)

看到一个有意思的东西:

<?php
$arr = ['1', '2', '3', '4']; foreach ($arr as &$i) {}
echo implode($arr, ', ')."\n"; foreach ($arr as $i) {}
echo implode($arr, ', ')."\n";
?>

运行结果:

1, 2, 3, 4
1, 2, 3, 3

当使用了 & 引用后,下一次遍历数组的结果发生了变化

调试下看看:

$arr = ['1', '2', '3', '4'];

foreach ($arr as &$i) {}
echo implode($arr, ', ')."\n";
var_dump($arr);
for($i=0;$i<count($arr);$i++){
echo $arr[$i]."-$i, ";
var_dump($arr);
}
echo "\n";
foreach ($arr as $i) {}
echo implode($arr, ', ')."\n";

运行结果(可以看到,第二次循环里面,每次循环后,最后一个数组元素一直被引用着,而且等于当时数组遍历的值):

1, 2, 3, 4
array(4) {
[0]=>
string(1) "1"
[1]=>
string(1) "2"
[2]=>
string(1) "3"
[3]=>
&string(1) "4"
}
1-0, array(4) {
[0]=>
string(1) "1"
[1]=>
string(1) "2"
[2]=>
string(1) "3"
[3]=>
&int(0)
}
2-1, array(4) {
[0]=>
string(1) "1"
[1]=>
string(1) "2"
[2]=>
string(1) "3"
[3]=>
&int(1)
}
3-2, array(4) {
[0]=>
string(1) "1"
[1]=>
string(1) "2"
[2]=>
string(1) "3"
[3]=>
&int(2)
}
3-3, array(4) {
[0]=>
string(1) "1"
[1]=>
string(1) "2"
[2]=>
string(1) "3"
[3]=>
&int(3)
} 1, 2, 3, 3

因为使用了 & 后,会影响后面的赋值,可以使用 unset 销毁变量

验证一下:

$arr = ['1', '2', '3', '4'];

foreach ($arr as &$i) {}
echo implode($arr, ', ')."\n";
var_dump($arr);
unset($i);
for($i=0;$i<count($arr);$i++){
echo $arr[$i]."-$i, ";
var_dump($arr);
}
echo "\n";
foreach ($arr as $i) {}
echo implode($arr, ', ')."\n";

输出:

1, 2, 3, 4
array(4) {
[0]=>
string(1) "1"
[1]=>
string(1) "2"
[2]=>
string(1) "3"
[3]=>
&string(1) "4"
}
1-0, array(4) {
[0]=>
string(1) "1"
[1]=>
string(1) "2"
[2]=>
string(1) "3"
[3]=>
string(1) "4"
}
2-1, array(4) {
[0]=>
string(1) "1"
[1]=>
string(1) "2"
[2]=>
string(1) "3"
[3]=>
string(1) "4"
}
3-2, array(4) {
[0]=>
string(1) "1"
[1]=>
string(1) "2"
[2]=>
string(1) "3"
[3]=>
string(1) "4"
}
4-3, array(4) {
[0]=>
string(1) "1"
[1]=>
string(1) "2"
[2]=>
string(1) "3"
[3]=>
string(1) "4"
} 1, 2, 3, 4

分析:

第一个 foreach 循环完以后,$i 指向 $arr[3],在第二个 foreach 循环时,这个引用没有断开
第二个 foreach 循环中:
第一次循环:$i = $arr[0] ;而 $i 又是 $arr[3] 的引用,则 $i 等于 $arr[3] 等于 $arr[0] 等于 '1' ,即 $i = $arr[3] = '1'
第二次循环:$i = $arr[1] ;而 $i 又是 $arr[3] 的引用,则 $i 等于 $arr[3] 等于 $arr[1] 等于 '2' ,即 $i = $arr[3] = '2'
第三次循环:$i = $arr[2] ;而 $i 又是 $arr[3] 的引用,则 $i 等于 $arr[3] 等于 $arr[2] 等于 '3' ,即 $i = $arr[3] = '3'
第四次循环:$i = $arr[3] = 3;
 
 
 

PHP foreach ($arr as &amp;$value)的更多相关文章

  1. 浅谈JavaScript中forEach与each

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

  2. android studio 使用jar包,arr包和怎么使用githup开源项目中的aar包或module

    我这里的android studio的版本是2.2.3版本 一.现在大家都用android studio了,就有人问怎么使用jar包 其实使用jar包比较简单 直接吧jar放入工程的app目录下的li ...

  3. foreach

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

  4. PHP基础知识之foreach

    定义: foreach (array_expression as $value)------------循环时传递key foreach (array_expression as $key => ...

  5. 在JS中关于堆与栈的认识function abc(a){ a=100; } function abc2(arr){ arr[0]=0; }

    平常我们的印象中堆与栈就是两种数据结构,栈就是先进后出:堆就是先进先出.下面我就常见的例子做分析: main.cpp int a = 0; 全局初始化区 char *p1; 全局未初始化区 main( ...

  6. 给定一个double类型的数组arr,其中的元素可正可负可0,返回子数组累乘的最大乘积。例如arr=[-2.5,4,0,3,0.5,8,-1],子数组[3,0.5,8]累乘可以获得最大的乘积12,所以返回12。

    分析,是一个dp的题目, 设f[i]表示以i为结尾的最大值,g[i]表示以i结尾的最小值,那么 f[i+1] = max{f[i]*arr[i+1], g[i]*arr[i+1],arr[i+1]} ...

  7. js的forEach,for in , for of

    forEach遍历数组 [].forEach(function(value, index, array) { // ... }); 例子 var myArry =[1,2,3,4]; myArry.d ...

  8. nginx+iis、NLB、Web Farm、Web Garden、ARR

    nginx+iis实现负载均衡 在win2008R2上使用(NLB)网络负载均衡 NLB网路负载均衡管理器详解 [译文]Web Farm和Web Garden的区别? IIS负载均衡-Applicat ...

  9. 数组求和,计算给定数组 arr 中所有元素的总和

    一,题目分析:可以使用数组的归并方法计算,reduce和reduceRight.二者作用几乎相同.只是归并方向相反.reduce和reduceRight都可以接收两个参数.第一个是在每一项上调用的函数 ...

  10. js数组键入值push和 arr[]i]区别

    push 和 arr[i] 遍历 var arr = new Array(); $(":check").each(function(i){if(this.checked==true ...

随机推荐

  1. TinyMCE4.x整合教程-Xproer.WordPaster

    版权所有 2009-2017 荆门泽优软件有限公司 保留所有权利 官方网站:http://www.ncmem.com/ 产品首页:http://www.ncmem.com/webplug/wordpa ...

  2. POJ1753 Flip Game(位运算+暴力枚举)

    Flip game is played on a rectangular 4x4 field with two-sided pieces placed on each of its 16 square ...

  3. 建造者(Builder)模式 *

    一. 建造者(Builder)模式 建造者模式可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象. 二. Builder模式的结构: 建造者(Bu ...

  4. web利用table表格生成excel格式问题

    当我们把web页面上的table导成excel形式时,有时候我们的数据需要以特定的格式呈现出来,这时候我们就需要给指定的单元格添加一些样式规格信息. 文本:vnd.ms-excel.numberfor ...

  5. Vue vue-resource发送Http请求

    vue-resource 1.cnpm install vue-resource --save 2.在main.js中import VueResource from 'vue-resource' 3. ...

  6. javascript 视频播放指定的时间段

    javascript 视频播放指定的时间段 一.html5 vedio: //指定开始时间 player.currentTime=startPoint; player.play(); //使用事件来控 ...

  7. 基于verilog的FFT算法8点12位硬件实现

    FFT算法8点12位硬件实现 (verilog) 1 一.功能描述: 1 二.设计结构: 2 三.设计模块介绍 3 1.蝶形运算(第一级) 3 2.矢量角度旋转(W) 4 3.CORDIC 结果处理 ...

  8. 第0篇 Python前言

    1.注释 1)注释的作用: 用自己熟悉的语言在代码中添加注释,方便后期自己查看和理解,也方便其他人查看和理解代码含义. 2)单行注释: 以#号开头,#后面的所有内容均不会被程序执行,起到辅助说明的作用 ...

  9. iis 重启命令

    打开IIS配置窗口的CMD命令:开始---运行---CMD----输入inetmgr  直接使用CMD我们可以操作很多事情,比如启动IIS,重启IIS,停止IIS 重启IIS服务器,开始->运行 ...

  10. 2.1、Softmax Regression模型

    Softmax Regression模型 由于Logistics Regression算法复杂度低,容易实现等特点,在工业中的到广泛的使用,但是Logistics Regression算法主要用于处理 ...