在百度知道上碰到一段关于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中引用&的一个小实例的更多相关文章

  1. 《挑战30天C++入门极限》 对C++中引用的补充说明(实例)

        对C++中引用的补充说明(实例) #include <iostream>    #include <string>    using namespace std;    ...

  2. Jmeter Web 性能测试入门 (四):一个小实例带你学会 Jmeter 脚本编写

    测试场景: 模拟并发100个user,在TesterHome 站内搜索VV00CC 添加线程组 添加HTTP信息头管理器 添加HTTP Sampler 填写HTTP Sampler中的信息 添加监听器 ...

  3. JavaScript进阶(二)在一个JS文件中引用另一个JS文件

    在一个JS文件中引用另一个JS文件       转载地址:http://blog.csdn.net/zndxlxm/article/details/7875787 方法一 在调用文件的顶部加入下例代码 ...

  4. 在一个jsp页面中引用另一个jsp文件的路径的问题

    为了提高代码的重用性,经常需要在一个jsp页面中引用另一个jsp文件的代码.关于引用时的路径的问题.下面只介绍动态引用的,我觉得静态引用的应该也一样. 相对路径: 一.在同一个文件夹下,a.jsp中引 ...

  5. VB.NET开发中遇到的一个小问题

    在修改公司用vb.net的写的代码时,遇到一个小问题 页面上有一个button, ID是btnNext, 在属性页中,它的click事件对应的是cmdNext, 我像在c#中一样,在属性页中双击cmd ...

  6. 关于JNI程序中引用另外一个lib

    我最近在写一个j2se的程序,我用的是开源的org.amse.ys.zip包里的代码,这部分代码是在FBReaderJ里抽取的,但是其中包含了一些native的方法,需要用的zlib库,而FBRead ...

  7. vue-router的一个小实例

    非2.0的 vue2.0还有vue-router2.0的改变还是挺大的 vue-router是Vue.js官方的路由插件,它和vue.js是深度集成的,适合用于构建单页面应用.vue的单页面应用是基于 ...

  8. 在一个JS文件中引用另一个JS文件

    方法一,在调用文件的顶部加入下例代码: document.write(”<script language=javascript src=’/js/import.js’></scrip ...

  9. 如何在maven项目中引用领一个项目

    1 有两个项目 maven01  和maven 02,想在maven 02中引用maven01的方法,该如何操作呢 maven01中Factory类中的方法 public class Factory ...

随机推荐

  1. 根据优先关系矩阵使用逐次加一发构造优先函数(Java)

    若已知运算符之间的优先关系,可按如下步骤构造优先函数: 1.对每个运算符a(包括#在内)令f(a)=g(a)=1 2.如果a⋗b且f(a)<=g(b)令f(a)=g(b)+1 3.如果a⋖b且f ...

  2. Jquery ajaxSubmit()的浏览器兼容问题

    form.ajaxSubmit({ 2 beforeSubmit: function() { 3 if (FinanceUtil.validate(form)) { 4 FinanceUtil.loa ...

  3. MarkDown语法 学习笔记 效果源码对照

    MarkDown基本语法学习笔记 Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式. 下面将对Markdown的基本使用做一个介绍 目 ...

  4. 纯CSS图片缩放后显示详细信息

    哎~!突然好久没更新博客了,最近总在下雨,晚上也经常没有时间来管理博客(目前在敲自己的一个平台,晢时还在写逻辑层的代码),好吧!废话不多说了,言归正传. 现在很多图片缩放的特效大多数都是用javasc ...

  5. Node.js~ioredis处理耗时请求时连接数瀑增

    回到目录 关于redis连接数过高的解释 对于node.js开发环境里,使用传统的redis或者使用ioredis都是不错的选择,而在处理大数据请求程中,偶尔出现了连接池( redis服务端的最大可用 ...

  6. Python的join()函数和split()函数

    join()方法 ------------------------------------------------------------------------------------------- ...

  7. JBoss快速入门知识

    1.下载地址: http://www.jboss.org/jbossas/downloads

  8. org.hibernate.LazyInitializationException...no session or session was closed

    org.hibernate.LazyInitializationException:failed to lazily initialize a collection of role:cn.its.oa ...

  9. 2017年最好的6个WEB前端开发手册下载

    php中文网为你推荐6个web前端开发相关手册下载,适合web开发人员和php web开发人员进行下载参考学习! 一. html5中文手册 通过制定如何处理所有 HTML 元素以及如何从错误中恢复的精 ...

  10. python爬虫从入门到放弃(六)之 BeautifulSoup库的使用

    上一篇文章的正则,其实对很多人来说用起来是不方便的,加上需要记很多规则,所以用起来不是特别熟练,而这节我们提到的beautifulsoup就是一个非常强大的工具,爬虫利器. beautifulSoup ...