PHP foreach 引用 &
以前用foreach,总喜欢在第二次遍历时改变value的拼写,比如
$x = array("a", "b", "c");
foreach ($x as &$value)
{
echo $value." ";
}
echo "<br/>";
foreach ($x as $value2)
{
echo $value2." ";
}
得到结果
a b c
a b c
并没有什么不妥.
今天写的时候没有留神,发现出错了,示例如下
$x = array("a", "b", "c");
foreach ($x as &$value)
{
echo $value." ";
}
echo "<br/>";
foreach ($x as $value)
{
echo $value." ";
}
得到结果
a b c
a b b
发现问题了吧?
这是因为在第一次的foreach中使用了引用,使得$value变成了引用变量,并且$value与 $x[ 2 ]共享变量值,在第二个foreach中,不断的将$x中的值赋给$value,进而$x[2]的值也会跟随者$value的变化而变化.
过程如下:
第一个foreach,第一次$value = $x[0]=a,第二次$value = $x[1]=b,第三次$value = $x[2]=c.此时,$value与 $x[ 2 ]共享变量值
第二个foreach,第一次$value = $x[0]=a(此时$x[x]也就=a),第二次$value = $x[1]=b(此时$x[x]也就=b),第三次$value = $x[2]=b(因为上一步已经将$x[2]改变成了b)
以后为了避免类似情况发生可使用以下方法:
①第一次foreach使用引用后,unset($value); 来取消$value对地址的共享
②在第二次或更多遍历时改变value的拼写
PHP foreach 引用 &的更多相关文章
- php foreach引用赋值
在写代码时发现php foreach引用赋值会导致意外的行为. 代码示例: <?php $arr = array('a','b','c'); foreach($arr as $k=>&am ...
- foreach 引用传值&
foreach 引用传值& php 怎么在foreach中循环数组 ,的时候添加元素跟值 foreach($arr as $key => &$vo){ //注意,由于上面遍 ...
- 说说PHP中foreach引用的一个坑
From: http://blog.csdn.net/yipiankongbai/article/details/45307767 先来看看下面这段代码: <?php $arr = array( ...
- PHP 数组 foreach引用导致的bug
<?php $arr = array('a', 'b', 'c'); foreach($arr as &$v) {} foreach($arr as $v) {} var_dump($a ...
- PHP foreach引用&
将以下代码打印 $variable = ['a', 'b', 'c']; foreach ($variable as $key => &$value) { } foreach ($var ...
- foreach引用坑
先看下面代码 $arr1 = [1, 2]; foreach($arr1 as $key => $value) { $value = $value + 1; } var_dump($key, $ ...
- foreach中引用 的问题
在工作中遇到 关于 php foreach 引用的一个问题 简单来说,如下代码 $arr=array('a','b','c' ,'d'); foreach($arr as $k=>&$v ...
- foreach绑定
目的 foreach可以将一个数组中的实体循环的进行绑定.这在将一个list显示成table时非常有用. 假设数组是observable的,当在绑定后做了add, remove,或者重新排序后,绑定会 ...
- PHP 易出问题记录
PHP foreach引用缺陷 <?php $array = array(1, 2, 3); foreach ($array as &$v) {} foreach ($array as ...
随机推荐
- ThreadPool用法与优势
1. 线程池的优点: 合理利用线程池能够带来三个好处.第一:降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗.第二:提高响应速度.当任务到达时,任务可以不需要等到线程创建就能立即执 ...
- 解决Oracle XE报错ORA-12516(oracle回话数超出限制)
本地安装的oracleXEUniv—oracle特别版,免费用户可以自由使用,但有连接数量和存储限制. 最近遇到一个问题,当我的SSM项目连接本地数据库oracleXE后,我的navicat再连接时就 ...
- RESTE MASTER和reset slave
RESET MASTER 删除所有index file 中记录的所有binlog 文件,将日志索引文件清空,创建一个新的日志文件,这个命令通常仅仅用于第一次用于搭建主从关系的时的主库, 注意 re ...
- vue v-for直接循环数字
<svg class="icon" aria-hidden="true" v-for="index of 5" :key=" ...
- CentOS 7.x关闭/开启防火墙出现Unit iptables.service failed to load: No such file or directory问题解决
一直用CentOS 6.x,今天用CentOS7.3版本时,防火墙配置后执行service iptables start出现”Failed to restart iptables.service: U ...
- 转载 STM32 使用Cubemx 建一个USB(HID)设备下位机,实现数据收发
STM32 使用Cubemx 建一个USB(HID)设备下位机,实现数据收发 本文转载自 https://www.cnblogs.com/xingboy/p/9913963.html 这里我主要说一 ...
- zabbix监控httpd进程、添加动作、报警媒介类型
1.在server_agent端创建脚本 mkdir -p /usr/local/etc/zabbix_scripts vi /usr/local/etc/zabbix_scripts/check_h ...
- python3.5 元组
1.创建元祖 tup1 = ('jenkins','mysql') print(tup1) ssh://root@192.168.0.204:22/usr/bin/python -u /home/pr ...
- BigDecimal 的一点想法
1.java中会有精度问题,比如: double d1 = 2.0; double d2 = 1.7; System.out.println(d1-d2);//0.30000000000000004 ...
- C++编译错误提示 [Error] name lookup of 'i' changed for ISO '
在VC 6 中,i的作用域范围是函数作用域,在for循环外仍能使用变量i 即: for (int i = 0; i < n; ++i) { //…… } cout<< ...