PHP foreach引用

PHP  foreach引用

首先,上代码

$arr=[1,2,3,4,5,6];
foreach ($arr as $key => &$value) {
if($value==4){
unset($arr[$key]);
}
}
foreach ($arr as $key => $value) {
echo $value;
}

各位认为echo的结果会是什么?你可能会很快算出结果为 ‘1,2,3,5,6’,但是,结果会有点小意外,各位不妨输出一下 结果会是‘1,2,3,5,5’。那么问题来了,为什么?

那么下面我们来解释一下:

在 $value 之前加上 & 来修改数组的元素。此方法将以引用赋值而不是拷贝一个值。

如果我们直接将第一次的结果直接输出,结果不会发生变化,会是‘1,2,3,4,5,6’;

当我们第二次foreach循环时此时第一次循环对$value最后的引用还在,所以当我们第二次用$value执行后结果会发生变化。

解决办法:1、在第一次foreach循环完成后unset($value),取消掉引用;2、在第二次循环时不用$value变量换成一个其他任意变量都可以;

$arr=[1,2,3,4,5,6];
foreach ($arr as $key => &$value) {
	if($value==4){
		unset($arr[$key]);
	}
	//如果没有unset($value),$value仍然是对最后一项的引用

}
foreach ($arr as $key => $value) {
//$arr [5]将会更新每个值$value
echo $value;
//直到最后,倒数第二个
}

时间: 2024-10-08 20:27:12

PHP foreach引用的相关文章

php foreach引用赋值

在写代码时发现php foreach引用赋值会导致意外的行为. 代码示例: <?php $arr = array('a','b','c'); foreach($arr as $k=>&$v) { } print_r($arr); foreach($arr as $k=>$v) { } print_r($arr); ?> 输出结果: Array ( [0] => a [1] => b [2] => c ) Array ( [0] => a [1] =&

说说PHP中foreach引用的一个坑

From: http://blog.csdn.net/yipiankongbai/article/details/45307767 先来看看下面这段代码: <?php $arr = array('apple','banana','cat','dog'); foreach($arr as $key=>$val) { //some code } echo $val; //输出dog echo $key; //输出3 //下面对val进行赋值 $val = 'e'; print_r($arr); /

PHP 数组 foreach引用导致的bug

<?php $arr = array('a', 'b', 'c'); foreach($arr as &$v) {} foreach($arr as $v) {} var_dump($arr); /* 结果为: array(3) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> &string(1) "b" } */ //第一个foreach用引用赋值的方式将数

PHP数组foreach引用问题

<?php $arr = array('1','2'); foreach($arr as &$value){ } foreach($arr as $value){ var_dump($value); } 输出 string(1) "1" string(1) "1" 这样解释吧,把foreach展开成赋值的话 foreach($arr as &$value) { //noop } 大致是 #begin first foreach $value =

foreach中引用 的问题

在工作中遇到 关于 php foreach 引用的一个问题 简单来说,如下代码 $arr=array('a','b','c' ,'d'); foreach($arr as $k=>&$v) { ........ } foreach($arr as $k=>$v) { ........ } print_r($arr); 结果是 a b c c 参考了 这篇文章,以及 这篇文章 在第一次foreach 遍历结束后,$v的值为'd',对应的key为3,注意这里$v使用的是引用 在第二次for

foreach绑定

目的 foreach可以将一个数组中的实体循环的进行绑定.这在将一个list显示成table时非常有用. 假设数组是observable的,当在绑定后做了add, remove,或者重新排序后,绑定会找到相应的元素做新增.删除或者排序,而不会影响其他不相关的DOM元素.这比重新生成整个foreach的输出要高效的多. 当然,你也可以任意的使用其他控制语句如if和with来嵌套foreach绑定. 例1:遍历数组 示例使用foreach循环一个数组实体展示成一个只读的table <table>

【Web API系列教程】3.7 — 实战:处理数据(创建UI视图)

在本节,你将开始为app定义HTML,并在HTML和视图模型间添加数据绑定. 打开Views/Home/Index.cshtml文件.用以下代码替换掉文件的所有内容. @section scripts { @Scripts.Render("~/bundles/app") } <div class="page-header"> <h1>BookService</h1> </div> <div class="

mybatis 动态SQL查询总结

背景 ××项目需要提供系统部分函数第三方调用接口,基于安全性和避免暴露数据库表信息的基础上进行函数接口的设计,根据第三方调用身份的权限提供某张表的自定义集合.本项目基于mybatis的持久层框架,支持定制化的SQL,这样可以避免拼接sql语句的痛苦.例如拼接时要确保不能添加空格,还要注意去掉列表的最后一个列名的都逗号.基于OGNL的表达式的mybatis框架可以彻底解决这种痛苦. 动态返回mysql某张表指定列的名字,类型和注释 <select id="queryColumns"

C#值参数和引用参数,方法的重载,foreach,数组,以及ref和out的用法

1.方法的传输传递 值参数:传递的是副本 引用参数:自身 保留自定义的方法中对值的改变 形参影响实参ref:对应的形参和实参都用ref修饰 输出参数:实参不用赋值,但是自定义方法内必须对此参数赋值!!! 把自定义方法产生的结果带回调用处out:对应的形参和实参都用out修饰 必须在自定义方法中赋值 注:如果需要返回一个参数 使用return 如果需要反回多个参数 使用ref 或者 out TryParse用法:自行判断转换是否成功 转换成功反回true 转换失败返回false 例: bool f