PHP7 foreach() 函数修改


Posted in PHP onMarch 09, 2021

一、foreach()循环对数组内部指针不再起作用。

$array = [0, 1, 2];
foreach ($array as &$val) 
{
    var_dump(current($array));
}

PHP7运行的结果会打印三次int(0),也就是说数组的内部指针并没有改变。

之前运行的结果会打印int(1), int(2)和bool(false)

 

 二、按照值进行循环的时候,foreach是对该数组的拷贝操作

foreach按照值进行循环的时候(by-value),foreach是对该数组的一个拷贝进行操作。这样在循环过程中对数组做的修改是不会影响循环行为的。

$array = [0, 1, 2];
$ref =& $array; // Necessary to trigger the old behavior
foreach ($array as $val) {
    var_dump($val);
    unset($array[1]);
}

上面的代码虽然在循环中把数组的第二个元素unset掉,但PHP7还是会把三个元素打印出来:(0 1 2)

之前老版本的PHP会把1跳过,只打印(0 2).

 

三、按照引用进行循环的时候,对数组的修改会影响循环。

如果在循环的时候是引用的方式,对数组的修改会影响循环行为。不过PHP7版本优化了很多场景下面位置的维护。比如在循环时往数组中追加元素。

$array = [0];
foreach ($array as &$val) {
    var_dump($val);
    $array[1] = 1;
}

上面的代码中追加的元素也会参与循环,这样PHP7会打印"int(0) int(1)",老版本只会打印"int(0)"。

 

四、对简单对象plain (non-Traversable) 的循环。

对简单对象的循环,不管是按照值循环还是按引用循环,和按照引用对数组循环的行为是一样的。不过对位置的管理会更加精确。

 

五、对迭代对象(Traversable objects)对象行为和之前一致。

stackoverflow上面的解释:Traversable object is one that implements Iterator or IteratorAggregate interface。如果一个对象实现了iterator或者IteratorAggregate接口,即可称之为迭代对象。

PHP 相关文章推荐
十天学会php之第二天
Oct 09 PHP
用PHP实现浏览器点击下载TXT文档的方法详解
Jun 02 PHP
PHP中判断变量为空的几种方法分享
Aug 26 PHP
CI框架入门示例之数据库取数据完整实现方法
Nov 05 PHP
php中最简单的字符串匹配算法
Dec 16 PHP
php使用explode()函数将字符串拆分成数组的方法
Feb 17 PHP
PHP中把数据库查询结果输出为json格式简单实例
Apr 09 PHP
微信自定义菜单的处理开发示例
Apr 16 PHP
Laravel实现构造函数自动依赖注入的方法
Mar 16 PHP
Zend Framework入门教程之Zend_Db数据库操作详解
Dec 08 PHP
PHP基于mcript扩展实现对称加密功能示例
Feb 21 PHP
如何在PHP中使用AES加密算法加密数据
Jun 24 PHP
PHP7 list() 函数修改
Mar 09 #PHP
PHP7变量处理机制修改
Mar 09 #PHP
PHP7新特性
Mar 09 #PHP
Yii 实现数据加密和解密
Mar 09 #PHP
TP - 比RBAC更好的权限认证方式(Auth类认证)
Mar 09 #PHP
THINKPHP-Apache服务器中使用Alias虚拟目录URL重写 隐藏index.php
Mar 09 #PHP
宝塔面板在NGINX环境中TP5.1如何运行?
Mar 09 #PHP
You might like
兼容性最强的PHP生成缩略图的函数代码(修改版)
2011/01/18 PHP
使用php伪造referer的方法 利用referer防止图片盗链
2014/01/20 PHP
php跨域cookie共享使用方法
2014/02/20 PHP
ThinkPHP调用common/common.php函数提示错误function undefined的解决方法
2014/08/25 PHP
PHP微信开发之微信消息自动回复下所遇到的坑
2016/05/09 PHP
PHP实现批量删除(封装)
2017/04/28 PHP
javascript 客户端验证上传图片的大小(兼容IE和火狐)
2009/08/15 Javascript
客户端限制只能上传jpg格式图片的js代码
2010/12/09 Javascript
jquery实现表格奇数偶数行不同样式(有图为证及实现代码)
2013/01/23 Javascript
js操作输入框中选择内容兼容IE及其他主流浏览器
2014/04/22 Javascript
Javascript基础教程之break和continue语句
2015/01/18 Javascript
javascript实现ecshop搜索框键盘上下键切换控制
2015/03/18 Javascript
JSON格式的时间/Date(2367828670431)/格式转为正常的年-月-日 格式的代码
2016/07/27 Javascript
JS中检测数据类型的几种方式及优缺点小结
2016/12/12 Javascript
创建一般js对象的几种方式
2017/01/19 Javascript
微信扫码支付零云插件版实例详解
2017/04/26 Javascript
vue使用keep-alive实现数据缓存不刷新
2017/10/21 Javascript
vue-router重定向和路由别名的使用讲解
2019/01/19 Javascript
angular 实现同步验证器跨字段验证的方法
2019/04/11 Javascript
element实现合并单元格通用方法
2019/11/13 Javascript
用python删除java文件头上版权信息的方法
2014/07/31 Python
Python爬虫之正则表达式的使用教程详解
2018/10/25 Python
解决pip install xxx报错SyntaxError: invalid syntax的问题
2018/11/30 Python
Python寻找两个有序数组的中位数实例详解
2018/12/05 Python
python实现加密的方式总结
2020/01/19 Python
Python坐标轴操作及设置代码实例
2020/06/04 Python
HTML5进阶段内联标签汇总(小篇)
2016/07/13 HTML / CSS
Linux操作面试题
2015/02/11 面试题
会计岗位描述
2014/02/22 职场文书
2014两会学习心得:时代的发展
2014/03/17 职场文书
艺人经纪人岗位职责
2014/04/15 职场文书
关于国庆节的演讲稿
2014/09/05 职场文书
大学生作弊检讨书
2014/09/11 职场文书
装饰技术负责人岗位职责
2015/04/13 职场文书
python 标准库原理与用法详解之os.path篇
2021/10/24 Python
高通2023 年将发布高性能PC处理器
2022/04/29 数码科技