大家一起来分析一下下面这段代码:

<?php

$arr = array();
$arr["abc"] = array("sex" => 100, "age" => 18);
$arr["bcd"] = array("sex" => 200, "age" => 19);
$arr["cde"] = array("sex" => 250, "age" => 17); $arr2 = array();
foreach ($arr as $name => $item) {
$item2 = &$arr2[$name];
$item2["sex"] = $item["sex"] + 300;
$item2["age"] = $item["age"] + 2;
} //unset($item2);
foreach ($arr2 as $name => $item2) {
echo "name: $name, age: " . $item2['age'] . ", sex: " . $item2['sex'] . PHP_EOL;
} echo "too little".PHP_EOL; //unset($item2);
$item2 = array("age" => 30, "sex" => 1000);
print_r($item2); echo "next step".PHP_EOL; foreach ($arr2 as $name => $item) {
echo "name: $name, age: " . $item['age'] . ", sex: " . $item['sex'] . PHP_EOL;
}

如果你觉得上面的代码的执行结果是

name: abc, age: , sex:
name: bcd, age: , sex:
name: cde, age: , sex:
too little
Array
(
[age] =>
[sex] =>
)
next step
name: abc, age: , sex:
name: bcd, age: , sex:
name: cde, age: , sex:

或者是

name: abc, age: , sex:
name: bcd, age: , sex:
name: cde, age: , sex:
too little
Array
(
[age] =>
[sex] =>
)
next step
name: abc, age: , sex:
name: bcd, age: , sex:
name: cde, age: , sex:

那么你就应该继续往下看了。因为上面两个结果都是错误的,真正的执行结果如下:

name: abc, age: , sex:
name: bcd, age: , sex:
name: cde, age: , sex:
too little
Array
(
[age] =>
[sex] =>
)
next step
name: abc, age: , sex:
name: bcd, age: , sex:
name: cde, age: , sex:

为什么会是这样一个结果呢?

因为在第一个引用赋值的foreach循环结束以后,$item2依然引用着$arr2数组的最后一个元素。而第二个foreach循环的时候,相当于把$arr2数组的元素依次赋值给$item2,也就相当于赋值给最后一个元素。也就是说,在第二个foreach遍历的过程中,$arr2数组的变化是这样的:

循环到第1个元素时的数组:[, , ]
循环到第2个元素时的数组:[, , ]
循环到第3个元素时的数组:[, , ]

而后的

$item2 = array("age" => 30, "sex" => 1000);

是为了告诉大家引用关系依然存在,并且,直接赋值也会导致引用的数据发生变化。(其实,第二个foreach循环时也是使用的直接赋值,只是有点不好观察出来)

那么,怎样才能将$item2与$arr2的最后一个元素的引用关系去掉呢?其实很简单,只要添加以下语句就可以了。也就是源代码中注释的地方。

unset($item2);

这也可以说是PHP的一个小坑,对于PHP新手来说,很容易犯这种错误而云里雾里,不知所措。希望这篇文章能帮到这样的新手。

最新文章

  1. C#设计模式-状态者模式
  2. 【项目】UICollectionViewFlowlayout再一次自定义
  3. VI中的多行删除与复制
  4. vim和tmux主题颜色不一致问题
  5. JPA的主键生成策略
  6. [STL]算法的泛化过程
  7. 使用内省方式操作JavaBean
  8. 小试牛刀——爬topit.me的图片,附github简易上传教程
  9. 【原创】shadowebdict开发日记:基于linux的简明英汉字典(三)
  10. oracle_体系结构图_逻辑结构图
  11. Codeforce#354_B_Pyramid of Glasses(模拟)
  12. 小白对Salesforce的简单认识(01)
  13. Struts2使用小问题-NoSuchFieldException
  14. 微信公众平台宣布增加接口IP白名单提高安全性
  15. Sql Server的艺术(六) SQL 子查询,创建使用返回多行的子查询,子查询创建视图
  16. (一二〇)CALayer的一些特性
  17. Flutter 即学即用系列博客——02 一个纯 Flutter Demo 说明
  18. RSA算法原理——(2)RSA简介及基础数论知识
  19. Java语法基础学习DayTwentyOne(网络编程)
  20. 阿里云挂载硬盘(windows)

热门文章

  1. 数据层面;MySQL查
  2. hdu6731 Angle Beats(ccpc秦皇岛A,计算几何)
  3. 快速打造自己的PHPStorm主题
  4. (转) hive调优(2)
  5. 【2018.08.01】(表/栈/队列/大小顶堆)学习Stark和Queue算法小记
  6. “可恶”的mariadb
  7. Git git rm和git rm --cached
  8. apache配置https重定向
  9. ORACLE中声明变量:define variable declare
  10. new Handler()和new Handler(Looper.getMainLooper())的区别是什么?