在百度知道上碰到一段关于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. 对象克隆(clone)实例详解

    <?php class Staff { public $name; public $age; public $salary; public function __construct($name, ...

  2. 在Centos7 更改Docker默认镜像和容器的位置

    图片出处:https://bobcares.com/wp-content/uploads/docker-change-directory.jpg 一.Why? 通常,当你开始使用docker时,我们并 ...

  3. R语言面向对象编程:S3和R6

    一.基于S3的面向对象编程 基于S3的面向对象编程是一种基于泛型函数(generic function)的实现方式. 1.S3函数的创建 S3对象组成:generic(generic FUN)+met ...

  4. JS中this到底指向谁?

    关于this的指向,是一个令人很头疼的问题.但是,你运气好,碰到了我.老夫这儿有本祖传秘籍,看懂这个,妈妈再也不用担心你的this指向不对啦! 归根结底,this指向就一句话:谁最终调用函数,this ...

  5. Springmvc+mybatis+restful+bootstrap框架整合

    框架整合: Springmvc + Mybatis + Shiro(权限) + REST(服务) + WebService(服务) + JMS(消息) + Lucene(搜搜引擎) + Quartz( ...

  6. Unity使用Mono.Xml代替System.Xml 测试

    测试环境 操作系统:Windows8.1 开发工具:Unity5.5.2 1.新建一个测试项目,观测引用System.Xml与Mono.Xml解析文件正确性,与打包后APK体积大小. 2.Mono.X ...

  7. 026 hibernate操作树形结构

    树形结构:也就是目录结构,有父目录.子目录.文件等信息,而在程序中树形结构只是称为节点. 一棵树有一个根节点,而根节点也有一个或多个子节点,而一个子节点有且仅有一个父节点(当前除根节点外),而且也存在 ...

  8. java虚拟机学习-JVM调优总结(5)

    数据类型 Java虚拟机中,数据类型可以分为两类:基本类型和引用类型.基本类型的变量保存原始值,即:他代表的值就是数值本身:而引用类型的变量保存引用值.“引用值”代表了某个对象的引用,而不是对象本身, ...

  9. 实现图标Icon+文字在div里自动中心居中(水平垂直居中)

    已知div行高设置text-align:center文字会自动居中. 通过:before来设置icon的地址和高宽. 需要设置图片默认的垂直居中条件,与文字一致,为text-bottom. 设置图片行 ...

  10. jquery实现点击进行跳转后,改点击的元素添加选中的效果

    <style> .active { color: red; } </style> //html代码 <ul id="tab2"> <li& ...