<?php $arr = [1, 2, 3,4]; foreach ($arr as &$v) { $v * 2; echo $v * 2; echo "<br>"; } var_dump($arr); foreach ($arr as $v) { echo "<pre>";var_dump($arr); }
解:https://cloud.tencent.com/developer/article/1472662
为了引出问题, 先来看下面一段代码:
<?php $arr = [ 'a', 'b', 'c', 'd',];foreach ($arr as &$each){ echo $each;}echo PHP_EOL;foreach ($arr as $each){ echo $each;}
这段代码很简单, 输出数组的元素两次, 感觉会输出两次 abcd? 不好意思, 输出结果如下:
是不是感觉很奇怪?我没有给数组赋值啊,数组的最后一个元素怎么在第二次循环的时候改变了呢?
再来看下面一段修改过得代码:
<?php $arr = [ 'a', 'b', 'c', 'd',];foreach ($arr as &$each){ echo $each;}echo PHP_EOL;$each = '1';var_dump($arr);
是不是发现了什么?
修改each变量会修改arr的最后一个元素, 这是为什么呢?
有过C语言使用经验的大概一看就明白是怎么回事了.
仔细看上面的foreach循环, each变量使用了&符号, 这个符号相当与c中的取址
php的foreach会在每次循环时,讲当前元素赋值给each, 然后进入循环体
当foreach遍历完成后, each变量没有释放而是指向了arr数组中的最后一个元素, 所以在后面给each赋值时, 其实改变的时arr数组的最后一个元素
到此, 流程已经明白了, 下面还原一下最开始的两次foreach过程:
在第一个foreach完成之后, 显然, each是指向数组的最后一个元素的, 下面进入第二个foreach:
第一次遍历, 将arr[0]赋值给each, 相当于arr[3]=arr[0], 此时arr为: ['a', 'b', 'c', 'a']
第二次遍历, 将arr[1]赋值给each, 相当于arr[3]=arr[1], 此时arr为: ['a', 'b', 'c', 'b']
第三次遍历, 将arr[2]赋值给each, 相当于arr[3]=arr[2], 此时arr为: ['a', 'b', 'c', 'c']
第四次遍历, 将arr[3]赋值给each, 相当于arr[3]=arr[3], 此时arr为: ['a', 'b', 'c', 'c']
分析的结果与之前输出的结果相同, 我们将第二次foreach的每次变化打印出来, 代码如下:
<?php $arr = [ 'a', 'b', 'c', 'd',];foreach ($arr as &$each){}foreach ($arr as $each){ var_dump($arr);}
结果截图如下:
结果与我们分析的完全一致, 至此, 完结
我使用的php版本为: 7.2
原创文章,转载请标明出处!
小程序支付&回调php centos Elasticsearch & LogStash & kibana安装及调试 Magento升级到2.4.3订单详情空白 nba2k23球员列表(八) nba2k23球员列表(七) nba2k23球员列表(六) nba2k23球员列表(五) nba2k23球员列表(四) nba2k23球员列表(三) nba2k23球员列表(二) nba2k23球员列表(一) nba2k22球员列表(四) nba2k22球员列表(三) nba2k22球员列表(二) nba2k22球员列表(一) NBA2K21球员大全 NBA2K20球员列表(五) NBA2K20球员列表(四) NBA2K20球员列表(三) NBA2K20球员列表(二) NBA2K20球员列表 wsl docker 突然 -v /sys/fs/cgroup:/sys/fs/cgroup:ro 无法挂载怎么办? 抽象类和接口 Magento 2 中扩展属性(extension_attributes.xml)的用途是什么? win10底部菜单栏卡死解决 docker容器映射所有端口到宿主机 【frp】RDP软件远程Listener state: Not listening [not supported] 升级到magento2.4.3,后台加载很慢解决方法 微信支付https://api.mch.weixin.qq.com/pay/unifiedorder返回null magento grid增加编辑按钮 PHP循环引用 Broken reference: the 'sales_order_tbs ' elemert canmot be atded as child to ‘left , bvcause the lat ubuntu安装swoole后报错:undefined symbol:XXXX swoole pcre.h: No such file or directory magento2 The account sign-in was incorrect or your account is disabled temporarily. Please wait and 批量修改表前缀 magento2.3.7升级2.4.3 elasticsearch可视化工具 pwaStudio-Magento2.4.3 mysql忘记密码创建新用户设置 Docker容器下 mysql source 导入数据库 如何在 Docker 上安装 Magento 2 mysql:基于扫码记录查找密接人员 varnish:pc mobile分开缓存 The requested PHP extension ext-gd * is missing from your system. Install or enable PHP's gd extensi Ubuntu切换指定PHP版本 magento-varnish安装自述 Ubuntu彻底卸载varnish Varnish - Error 503 Backend fetch failed Scandipwa magento2安装教程(在已存在的magento安装) Navicat15最新版本破解 (Navicat Premium 注册出现 No All Pattern Found! File Already Patched) mac本地运行MySQL;Navicat Authentication plugin ‘caching_sha2_password‘ cannot be loaded: dlope问题 mac本地运行PHP项目问题记录 通过 Binlog 日志来恢复 MySQL 数据 composer file could not be downloaded: SSL operation failed with code 1. OpenSSL Error messages: php Laravel统计所有API响应时长等信息 php计算累加的累加 composer PHP Fatal error: Allowed memory size of 1610612736 bytes exhausted (tried to allocate 4096 Go使用变量类型声明和方法的注意事项 方法 函数值 映射 切片的长度与容量 go基本类型(包、变量、函数、流程控制语句) 如何保证接口的幂等性 nginx 全部域名解析统一设置 mysql之存储过程(while循环、repeat循环、leave语句、loop循环、iterate语句) Laravel 契约和门面简单解读(Cache) Linux-centos安装node,node -v undefind Nginx 的反向代理、负载均衡、动静分离和高可用的原理 es6 set应用场景 vscode安装HTML Boilerplate解决不识别tpl后缀文件 laravel orm with如何指定select字段 laravel框架应用和composer扩展包开发 php实现斐波那契数列 内网穿透工具FRP搭建远程控制 微信小程序 动态添加view组件 唯物辩证法 nba2k游戏助手 更新日志 微信网页分享代码及提示签名错误解决方法 PHP支付宝支付兼容微信公众号 关于支付宝支付接口实际测试后的记录 网站后台权限管理 12306Bypass 分流软件 nba2kol2 12月份数据大更新,公众号球员更新名单进度贴 腾讯视频会员大放送 公众号新功能征集帖 我们知道CDN护航了双11十年,却不知道背后有那么多故事…… 企业微信第三方应用开发授权设置(PHP版) Linux下certpot 免费搭建https协议 CentOS7下Nginx强制http 301跳转到https的设置方法