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 相关文章推荐
JAVA/JSP学习系列之二
Oct 09 PHP
PHP中路径问题的解决方案
Oct 09 PHP
在PHP中使用灵巧的体系结构
Oct 09 PHP
PHP 魔术函数使用说明
May 14 PHP
PHPUnit PHP测试框架安装方法
Mar 23 PHP
php调用mysql数据 dbclass类
May 07 PHP
一个经典的PHP文件上传类分享
Nov 18 PHP
学习php设计模式 php实现原型模式(prototype)
Dec 07 PHP
Yii rules常用规则示例
Mar 15 PHP
PHP微信开发之模板消息回复
Jun 24 PHP
PHP实现浏览器中直接输出图片的方法示例
Mar 14 PHP
PHP+MySQL使用mysql_num_rows实现模糊查询图书信息功能
May 31 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针对多用户实现更换头像功能
2016/09/04 PHP
php+ajax+json 详解及实例代码
2016/12/12 PHP
PHP实现字符串翻转功能的方法【递归与循环算法】
2017/11/03 PHP
PHP defined()函数的使用图文详解
2019/07/20 PHP
php伪静态验证码不显示的解决方案
2019/09/26 PHP
thinkphp框架表单数组实现图片批量上传功能示例
2020/04/04 PHP
javascript 面向对象思想 附源码
2009/07/07 Javascript
jquery 操作单选框,复选框,下拉列表实现代码
2009/10/27 Javascript
YUI Compressor压缩JavaScript原理及微优化
2013/01/07 Javascript
JavaScript实现检查页面上的广告是否被AdBlock屏蔽了的方法
2014/11/03 Javascript
AngularJS初始化过程分析(引导程序)
2014/12/06 Javascript
node.js中的path.join方法使用说明
2014/12/08 Javascript
45个JavaScript编程注意事项、技巧大全
2015/02/11 Javascript
在jQuery中处理XML数据的大致方法
2015/08/14 Javascript
Bootstrap+jfinal实现省市级联下拉菜单
2016/05/30 Javascript
浅谈几种常用的JS类定义方法
2016/06/08 Javascript
Vue2.0 UI框架ElementUI使用方法详解
2017/04/14 Javascript
JavaScript实现鼠标滚轮控制页面图片切换功能示例
2017/10/14 Javascript
jQuery阻止事件冒泡实例分析
2018/07/03 jQuery
NodeJS 实现多语言的示例代码
2018/09/11 NodeJs
ES6中字符串的使用方法扩展
2019/06/04 Javascript
详解Webpack如何引入CDN链接来优化编译后的体积
2019/06/21 Javascript
Vue Router 实现动态路由和常见问题及解决方法
2020/03/06 Javascript
[02:43]DOTA2亚洲邀请赛场馆攻略——带你走进东方体育中心
2018/03/19 DOTA
python选择排序算法的实现代码
2013/11/21 Python
使用python将mdb数据库文件导入postgresql数据库示例
2014/02/17 Python
python遍历类中所有成员的方法
2015/03/18 Python
pyinstaller打包单个exe后无法执行错误的解决方法
2019/06/21 Python
如何利用Python模拟GitHub登录详解
2019/07/15 Python
scrapy数据存储在mysql数据库的两种方式(同步和异步)
2020/02/18 Python
Python2.7:使用Pyhook模块监听鼠标键盘事件-获取坐标实例
2020/03/14 Python
IE浏览器单独写CSS样式的几种方法
2014/10/14 HTML / CSS
详解CSS3 Media Queries中媒体属性的使用
2016/02/29 HTML / CSS
Prototype中如何为一个元素添加一个方法
2014/12/08 面试题
人事任命书格式
2014/06/05 职场文书
php+laravel 扫码二维码签到功能
2021/05/15 PHP