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 相关文章推荐
IIS环境下快速安装、配置和调试PHP5.2.0
Dec 17 PHP
FleaPHP的安全设置方法
Sep 15 PHP
深入理解php的MySQL连接类
Jun 07 PHP
PHP 基于Yii框架中使用smarty模板的方法详解
Jun 13 PHP
解析ajax事件的调用顺序
Jun 17 PHP
MyEclipse常用配置图文教程
Sep 11 PHP
推荐一款MAC OS X 下php集成开发环境mamp
Nov 08 PHP
php实现购物车功能(上)
Jul 23 PHP
解决yii2左侧菜单子级无法高亮问题的方法
May 08 PHP
php函数传值的引用传递注意事项分析
Jun 25 PHP
PHP之图片上传类实例代码(加了缩略图)
Jun 30 PHP
php监测数据是否成功插入到Mysql数据库的方法
Nov 25 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 COOKIE设置为浏览器进程
2009/06/21 PHP
PHP编码转换函数 自动转换字符集支持数组转换
2012/12/16 PHP
php PDO判断连接是否可用的实现方法
2017/04/03 PHP
php实现socket推送技术的示例
2017/12/20 PHP
本地对象Array的原型扩展实现代码
2010/12/04 Javascript
JS定义回车事件(实现代码)
2013/07/08 Javascript
js获取html页面节点方法(递归方式)
2013/12/13 Javascript
巧用jquery解决下拉菜单被Div遮挡的相关问题
2014/02/13 Javascript
jQuery-1.9.1源码分析系列(十)事件系统之事件体系结构
2015/11/19 Javascript
使用RequireJS库加载JavaScript模块的实例教程
2016/06/06 Javascript
bootstrap的3级菜单样式,支持母版页保留打开状态实现方法
2016/11/10 Javascript
JavaScript三种绑定事件方式及相互之间的区别分析
2017/01/10 Javascript
vue.js的手脚架vue-cli项目搭建的步骤
2017/08/30 Javascript
js字符限制(字符截取) 一个中文汉字算两个字符
2017/09/12 Javascript
vue中倒计时组件的实例代码
2018/07/06 Javascript
js设计模式之单例模式原理与用法详解
2019/08/15 Javascript
iSlider手机端图片滑动切换插件使用详解
2019/12/24 Javascript
webpack proxy 使用(代理的使用)
2020/01/10 Javascript
JS Html转义和反转义(html编码和解码)的实现与使用方法总结
2020/03/10 Javascript
Js和VUE实现跑马灯效果
2020/05/25 Javascript
解决vue中el-tab-pane切换的问题
2020/07/19 Javascript
vue和H5 draggable实现拖拽并替换效果
2020/07/29 Javascript
linux环境下安装pyramid和新建项目的步骤
2013/11/27 Python
详解Django中六个常用的自定义装饰器
2018/07/04 Python
利用Python进行数据可视化常见的9种方法!超实用!
2018/07/11 Python
Python读取Excel表格,并同时画折线图和柱状图的方法
2018/10/14 Python
pyqt5、qtdesigner安装和环境设置教程
2019/09/25 Python
python3判断IP地址的方法
2021/03/04 Python
html svg生成环形进度条的实现方法
2019/09/23 HTML / CSS
size?瑞典:英国伦敦的球鞋精品店
2018/03/01 全球购物
西班牙在线药店:DosFarma
2020/03/28 全球购物
为什么需要版本控制?
2013/08/08 面试题
生物技术毕业生自荐信
2013/10/23 职场文书
高二地理教学反思
2014/01/24 职场文书
房产公证委托书范本
2014/09/20 职场文书
旅行社计调工作总结
2015/08/12 职场文书