博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
foreach 與 reference 的雷
阅读量:6857 次
发布时间:2019-06-26

本文共 1427 字,大约阅读时间需要 4 分钟。

前陣子公司定期技術研討會時,有人提出了一個問題。

$arr = [1, 2, 3]; foreach ($arr as &$a) { } foreach ($arr as $a) { } var_dump($arr);

考慮以上程式碼執行結果,試問陣列 $arr 在執行結束後的值會是如何?

註:執行環境 PHP 7.1 without swoole

結果:$arr 的值為 [1, 2, 2]

 

緣由

在 PHP 中,foreach 結束後,迴圈中的索引值(index)及內容(value)並不會被消滅。

$a = [1, 2, 3]; foreach ($a as $v) {}var_dump($v); // int(3)foreach ($a as $k => $value) {}var_dump($k, $value); // int(2), int(3)

同理,foreach ($a as &$v) {} 時,在迴圈結束後 $v 值不會被消滅,其值仍是參考於(referenced by)陣列中的最後一個值,執行範例如下:

$a = [1, 2, 3]; foreach ($a as &$v) {}var_dump($a); /*array(3) {  [0]=>  int(1)  [1]=>  int(2)  [2]=>  &int(3)}*/

如果在迴圈結束後變更 $v 值,則陣列中的最後一個值也會一併被變更。

 

解決方法

在使用 foreach ($a as &$v) {} 這類寫法後,應手動 unset($v) 以避免潛在問題發生。

$a = [1, 2, 3];foreach ($a as &$v) {    // do something... }unset($v);

http://php.net/manual/en/control-structures.foreach.php

为了能够直接修改循环中的数组元素,在$ value之前 加上&。在这种情况下,该值将通过分配 。

警告

即使在foreach循环之后,$ value和最后一个数组元素的 引用仍然存在。建议通过销毁它。否则您将遇到以下行为:

$value) { // $arr[3] will be updated with each value from $arr... echo "{
$key} => {
$value} "; print_r($arr);}// ...until ultimately the second-to-last value is copied onto the last value// output:// 0 => 2 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 2 )// 1 => 4 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 4 )// 2 => 6 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 6 )// 3 => 6 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 6 )?>

 

转载于:https://www.cnblogs.com/yszr/p/10516397.html

你可能感兴趣的文章
vim设置一键执行python代码
查看>>
普通程序员该如何进阶为全栈工程师?
查看>>
WebStorm 开发配置
查看>>
Android动画相关(一)
查看>>
Spring @RequestBody与@ResponseBody注解
查看>>
python之turtle实现‘开花’和签名
查看>>
报表集成那点事
查看>>
《深入理解mybatis原理》 Mybatis数据源与连接池
查看>>
Spring小知识
查看>>
Oracle 12c连接时报错ORA-28040问题解决方法
查看>>
入门设计模式之状态模式
查看>>
Python机器学习(二):线性回归算法
查看>>
SQL Server中有关约束(constraint)的一些细节
查看>>
MapReduce高级特性
查看>>
CentOS6.9编译安装nginx1.4.7
查看>>
使用 CodeMirror 打造属于自己的在线代码编辑器
查看>>
表单元素01
查看>>
React Native项目Xcode打包发布iOS问题
查看>>
JPress v1.0-rc2 发布,新增微信小程序 SDK
查看>>
Confluence 6 为搜索引擎隐藏外部链接
查看>>