php中引用&的一个小实例
在百度知道上碰到一段关于php的引用符&的代码,对于初学都来说还是很考验理解分析能力的,把代码和自己的分析贴上来作一个备份,也与大家共勉。
代码片段:
$arr =array(1,2,3,4);
foreach ($arr as $k =>&$v) {}
foreach ($arr as $k=>$v) {}
print_r($arr);
输出结果:
Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 3
)
为什么是 1,2,3,3 而不是 1,2,3,4 呢? 如果你再多加几个值到数组中测试,会发现数组的最后一个值的结果总是等倒数第二个值。
这就是第一个 foreach 中的 引用符& 在作怪。
要理解结果为什么是 1,2,3,3,就得先理解 & 的作用。
& 是php中的引用,一个简单的例子:
$a = 1;
$b = $a; $b = 10;
echo $a;
正常的数值赋值是传值,改变 $b 的值并 $a 不受影响,而如果使用 引用& :
$a = 1;
$b = &$a; $b = 10;
echo $a;
改变 $b 的值发现 $a 的值也被改变了。
上面例子是 引用& 的最简单演示,再看下面这段代码:
$a = 1;
$b = 2;
$c = &$a;
$c = &$b; $c = 10;
echo $a;
echo $b;
先后让 $c 引用 $a 和 $b,最终 $c 只会引用到 $b,道理很简单,一个变量中只能保存一个值。
道理虽然简单,但却是理解上面最开始的两个 foreach 循环的关键,现在再回过头来看看代码,先只看第一次 foreach 循环:
foreach ($arr as $k =>&$v) {}
每次循环其实都是在给 $k 赋值,变量只有一个,所以当循环结束,$k 会有一个最终值即数组的最后一个值,因为使用了引用,所以其实 $k 变量是数组的最后一个值的引用。
现在再来看第二个循环:
foreach ($arr as $k=>$v) {}
如果没有第一个循环,那这里就是一个普通的 foreach 循环,循环过程不会对数组中的值形成实质的影响,但因为有了第一次循环,结果就不一样了,通过上面的分析已经知道了 $k 是数组中最后一个值的引用,所以这次循环其实是在不断地用数组的值对数组的最后一个值进行赋值,如果在每次循环时都把数组的值输出出来,将会看得更清楚:
foreach ($arr as $k=>$v) { print_r($arr); }
唯一可能的疑问是:既然是用数组的值对最后一个值赋值,那不应该刚好是不变么?因为值的数量没变,顺序也没变,从前往后赋值,假如数组的值是 1,2,3 赋值后的结果不还是 1,2,3 么?为什么最后一个值就变了呢?有此疑问是因为忽略了最后一个值一直在被修改,当循环执行到倒数第二次时,最后一个值被修改成了数组倒数第二个的值,再继续循环就是把自己的值赋给自己,那当然是不会有任何变化的,所以不论数组中的值是什么,两次循环之后,最终数组的最后两个值一定是相等的。
php中引用&的一个小实例的更多相关文章
- 《挑战30天C++入门极限》 对C++中引用的补充说明(实例)
对C++中引用的补充说明(实例) #include <iostream> #include <string> using namespace std; ...
- Jmeter Web 性能测试入门 (四):一个小实例带你学会 Jmeter 脚本编写
测试场景: 模拟并发100个user,在TesterHome 站内搜索VV00CC 添加线程组 添加HTTP信息头管理器 添加HTTP Sampler 填写HTTP Sampler中的信息 添加监听器 ...
- JavaScript进阶(二)在一个JS文件中引用另一个JS文件
在一个JS文件中引用另一个JS文件 转载地址:http://blog.csdn.net/zndxlxm/article/details/7875787 方法一 在调用文件的顶部加入下例代码 ...
- 在一个jsp页面中引用另一个jsp文件的路径的问题
为了提高代码的重用性,经常需要在一个jsp页面中引用另一个jsp文件的代码.关于引用时的路径的问题.下面只介绍动态引用的,我觉得静态引用的应该也一样. 相对路径: 一.在同一个文件夹下,a.jsp中引 ...
- VB.NET开发中遇到的一个小问题
在修改公司用vb.net的写的代码时,遇到一个小问题 页面上有一个button, ID是btnNext, 在属性页中,它的click事件对应的是cmdNext, 我像在c#中一样,在属性页中双击cmd ...
- 关于JNI程序中引用另外一个lib
我最近在写一个j2se的程序,我用的是开源的org.amse.ys.zip包里的代码,这部分代码是在FBReaderJ里抽取的,但是其中包含了一些native的方法,需要用的zlib库,而FBRead ...
- vue-router的一个小实例
非2.0的 vue2.0还有vue-router2.0的改变还是挺大的 vue-router是Vue.js官方的路由插件,它和vue.js是深度集成的,适合用于构建单页面应用.vue的单页面应用是基于 ...
- 在一个JS文件中引用另一个JS文件
方法一,在调用文件的顶部加入下例代码: document.write(”<script language=javascript src=’/js/import.js’></scrip ...
- 如何在maven项目中引用领一个项目
1 有两个项目 maven01 和maven 02,想在maven 02中引用maven01的方法,该如何操作呢 maven01中Factory类中的方法 public class Factory ...
随机推荐
- spring、spring mvc、mybatis框架整合基本知识
学习了一个多月的框架知识了,这两天很想将它整合一下.网上看了很多整合案例,基本都是基于Eclipse的,但现在外面公司基本都在用Intellij IDEA了,所以结合所学知识,自己做了个总结,有不足之 ...
- R的变量类型和常用函数
一.R的变量类型 也可以说是数据存储方式,有: Vector: 一维阵列 Matrics: 二维阵列,其中所有元素是同一数据类型. factor: 种类变量,可使用levels函数来规定种类变量的各级 ...
- Potato(邪恶土豆)–windows全版本猥琐提权
工作原理: Potato利用已知的Windows中的问题,以获得本地权限提升,即NTLM中继(特别是基于HTTP > SMB中继)和NBNS欺骗.使用下面介绍的技术,它有可能为一个非特权用户获得 ...
- 谈谈我的session跨域处理方法
情景:公司的一个网站有一个模块(测试模块)需要单独用另外的一个域名(www.btest.com)去访问,即网站需要用两个不同的域名去访问,如首页(www.abc.com)和测试模块(www.xyz.c ...
- Maven学习-简介、安装
Maven是一个项目管理工具,它包含了一个项目对象模型,一组标准集合,一个项目声明周期,一个依赖管理系统和用来运行定义在生命周期阶段中插件目标的逻辑.Maven采用了约定优于配置这一基本原则.在没有自 ...
- 配置网络yum源
有的时候服务器需要下载一些软件,是本地yum源没有的,这时候需要配置网络yum源 #cd /etc/yum.repos.d/ 把这个目录下的配置文件备份,改名:或者是把文件里边的enabled=1的 ...
- kotlin 语言入门指南一
基于官网的Getting Start部分,翻译如下: 基础语法 定义一个包 包的声明必须放在文件头部: package my.demo import java.util.* // ... 不需要加上p ...
- [Angularjs]$http.post与$.post
摘要 在angularjs发送post请求的时候,确实很困惑,在传递json数据的时候,总会遇到在服务端无法接受到参数的情况,这里有必要与$.post进行比较学习一下. 一个例子 这里模拟登录的一个场 ...
- bootstrap学习笔记之基础导航条 http://www.imooc.com/code/3111
基础导航条 在Bootstrap框中,导航条和导航从外观上差别不是太多,但在实际使用中导航条要比导航复杂得多.我们先来看导航条中最基础的一个--基础导航条. 使用方法: 在制作一个基础导航条时,主要分 ...
- Windows Server 2016中,安装PHP Manager,ARR3.0或者URL Rewrite 2.0无法成功的解决办法
如图: 无法安装原因都是这几个工具无法识别10.0这个版本,可以修改注册表来先完成安装,然后再改回去 PHPManager的修改方法如下: 打开注册表工具(运行Regedt32),找到:HKEY_LO ...