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. Ajax步骤

    var request = new XMLHttpRequest(); request.open("GET","get.php",ture); request. ...

  2. jQuery中关于toggle的使用

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>t ...

  3. Digester学习笔记(一)转载

    本博文系转载,作者原文已经无法找到,感谢原作者的辛苦整理 Digester学习笔记(一) 在windows下开发程序,用M$提供的接口处理.ini文件或管理注册表的键值是非常方便的.在java平台上开 ...

  4. delphi 指针 认识

    delphi 指针分为类型指针和无类型指针: 类型指针分为PChar.PInteger.PString等. 无类型指针Pointer. PPChar/PP...为指针的指针 @和Addr一样,为获取变 ...

  5. C# 读取Text文本,写入Text文本

    //读取 private void showMess() { this.dataGridViewX2.Rows.Clear(); //将车辆信息一行行添加到datagreatview 里面 Strea ...

  6. 十三、Node.js-fs模块(上)

    Node.js内置的fs模块就是文件系统模块,负责读写文件以及对文件进行相关操作. 下面直接可参考下面的代码进行fs模块里面基本方法的学习: /** * Created by Administrato ...

  7. 通过ssh访问NAT网络模式下的虚拟机Linux

    链接:https://blog.csdn.net/jiuduan2009/article/details/51737004 https://blog.csdn.net/disalone201107/a ...

  8. python 中文件夹的操作

    文件有两个管家属性:路径和文件名. 路径指明了文件在磁盘的位置,文件名原点的后面部分称为扩展名(后缀),它指明了文件的类型. 一:文件夹操作 Python中os 模块可以处理文件夹 1,当前工作目录 ...

  9. 【ARC077F】SS kmp+打表找规律

    Description ​ 如果某个串可以由两个一样的串前后连接得到,我们就称之为"偶串".比如说"xyzxyz"和"aaaaaa"是偶串, ...

  10. 【python】Python的logging模块封装

    #!/usr/local/python/bin # coding=utf-8 '''Implements a simple log library. This module is a simple e ...