Strange behavior Of foreach(foreach 的奇怪行为)
本文介绍了foreach 的奇怪行为的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我认为这是一个正常的程序,但这是我得到的输出:
数组([0] =>一个[1] =>b[2] =>C[3] =>C)
谁能给我解释一下?
解决方案
这是有据可查的 PHP 行为参见php.net foreach页面上的警告p><块引用>
警告
$value 的引用和最后一个数组元素即使在 foreach 循环之后仍然存在.建议通过 unset() 销毁.
$a = array('a', 'b', 'c', 'd');foreach ($a as &$v) { }未设置($v);foreach ($a as $v) { }print_r($a);
编辑
尝试了解此处实际发生的情况的分步指南
$a = array('a', 'b', 'c', 'd');foreach ($a as &$v) { }//第一次迭代 $v 是对 $a[0] ('a') 的引用foreach ($a as &$v) { }//第二次迭代 $v 是对 $a[1] ('b') 的引用foreach ($a as &$v) { }//第三次迭代 $v 是对 $a[2] ('c') 的引用foreach ($a as &$v) { }//第 4 次迭代 $v 是对 $a[3] ('d') 的引用//在foreach循环结束时,//$v 仍然是对 $a[3] ('d') 的引用foreach ($a as $v) { }//第一次迭代 $v(仍然是对 $a[3] 的引用)//设置为 $a[0] ('a') 的值.//因为是对$a[3]的引用,//它将 $a[3] 设置为 'a'.foreach ($a as $v) { }//第二次迭代 $v(仍然是对 $a[3] 的引用)//设置为 $a[1] ('b') 的值.//因为是对$a[3]的引用,//它将 $a[3] 设置为 'b'.foreach ($a as $v) { }//第三次迭代 $v(仍然是对 $a[3] 的引用)//设置为 $a[2] ('c') 的值.//因为是对$a[3]的引用,//它将 $a[3] 设置为 'c'.foreach ($a as $v) { }//第 4 次迭代 $v(仍然是对 $a[3] 的引用)//设置为 $a[3] ('c' 因为//最后一次迭代).//因为是对$a[3]的引用,//它将 $a[3] 设置为 'c'.
<?php
$a = array('a', 'b', 'c', 'd');
foreach ($a as &$v) { }
foreach ($a as $v) { }
print_r($a);
?>
I think it's a normal program but this is the output I am getting:
Array
(
[0] => a
[1] => b
[2] => c
[3] => c
)
Can someone please explain this to me?
解决方案
This is well-documented PHP behaviour See the warning on the foreach page of php.net
Warning
Reference of a $value and the last array element remain even after the foreach loop. It is recommended to destroy it by unset().
$a = array('a', 'b', 'c', 'd');
foreach ($a as &$v) { }
unset($v);
foreach ($a as $v) { }
print_r($a);
EDIT
Attempt at a step-by-step guide to what is actually happening here
$a = array('a', 'b', 'c', 'd');
foreach ($a as &$v) { } // 1st iteration $v is a reference to $a[0] ('a')
foreach ($a as &$v) { } // 2nd iteration $v is a reference to $a[1] ('b')
foreach ($a as &$v) { } // 3rd iteration $v is a reference to $a[2] ('c')
foreach ($a as &$v) { } // 4th iteration $v is a reference to $a[3] ('d')
// At the end of the foreach loop,
// $v is still a reference to $a[3] ('d')
foreach ($a as $v) { } // 1st iteration $v (still a reference to $a[3])
// is set to a value of $a[0] ('a').
// Because it is a reference to $a[3],
// it sets $a[3] to 'a'.
foreach ($a as $v) { } // 2nd iteration $v (still a reference to $a[3])
// is set to a value of $a[1] ('b').
// Because it is a reference to $a[3],
// it sets $a[3] to 'b'.
foreach ($a as $v) { } // 3rd iteration $v (still a reference to $a[3])
// is set to a value of $a[2] ('c').
// Because it is a reference to $a[3],
// it sets $a[3] to 'c'.
foreach ($a as $v) { } // 4th iteration $v (still a reference to $a[3])
// is set to a value of $a[3] ('c' since
// the last iteration).
// Because it is a reference to $a[3],
// it sets $a[3] to 'c'.
这篇关于foreach 的奇怪行为的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:foreach 的奇怪行为
基础教程推荐
猜你喜欢
- Doctrine 2 - 在多对多关系中记录更改 2022-01-01
- 在 CakePHP 2.0 中使用 Html Helper 时未定义的变量 2021-01-01
- 如何在 XAMPP 上启用 mysqli? 2021-01-01
- HTTP 与 FTP 上传 2021-01-01
- PHP 守护进程/worker 环境 2022-01-01
- 使用 PDO 转义列名 2021-01-01
- 找不到类“AppHttpControllersDB",我也无法使用新模型 2022-01-01
- 在 yii2 中迁移时出现异常“找不到驱动程序" 2022-01-01
- 如何在 Symfony 和 Doctrine 中实现多对多和一对多? 2022-01-01
- phpmyadmin 错误“#1062 - 密钥 1 的重复条目‘1’" 2022-01-01