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 相关文章推荐
mysql5写入和读出乱码解决
Nov 25 PHP
PHP 截取字符串专题集合
Aug 19 PHP
匹配csdn用户数据库与官方用户的重合度并将重叠部分的用户筛选出来
Dec 25 PHP
浅析PHP substr,mb_substr以及mb_strcut的区别和用法
Jun 21 PHP
PHP5各个版本的新功能和新特性总结
Mar 16 PHP
PHP生成随机密码类分享
Jun 25 PHP
php的XML文件解释类应用实例
Sep 22 PHP
php将金额数字转化为中文大写
Jul 09 PHP
PHP单例模式简单用法示例
Jun 23 PHP
php实现的中秋博饼游戏之绘制骰子图案功能示例
Nov 06 PHP
thinkPHP5框架实现基于ajax的分页功能示例
Jun 12 PHP
PHP设计模式之简单工厂和工厂模式实例分析
Mar 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
MySQL相关说明
2007/01/15 PHP
php 模拟 asp.net webFrom 按钮提交事件的思路及代码
2013/12/02 PHP
zf框架db类的分页示例分享
2014/03/14 PHP
功能强大的PHP发邮件类
2016/08/29 PHP
关于B/S判断浏览器断开的问题讨论
2008/10/29 Javascript
extjs 初始化checkboxgroup值的代码
2011/09/21 Javascript
JavaScript 用cloneNode方法克隆节点的代码
2012/10/15 Javascript
调试Javascript代码(浏览器F12及VS中debugger关键字)
2013/01/25 Javascript
js判断某个方法是否存在实例代码
2015/01/10 Javascript
深入分析Cookie的安全性问题
2015/03/01 Javascript
JavaScript入门基础
2015/08/12 Javascript
浅谈AngularJs指令之scope属性详解
2016/10/24 Javascript
使用jquery实现的循环连续可停顿滚动实例
2016/11/23 Javascript
vue如何通过id从列表页跳转到对应的详情页
2018/05/01 Javascript
详解webpack之图片引入-增强的file-loader:url-loader
2018/10/08 Javascript
微信小程序实现点击图片旋转180度并且弹出下拉列表
2018/11/27 Javascript
基于Vue组件化的日期联动选择器功能的实现代码
2018/11/30 Javascript
Vue源码中要const _toStr = Object.prototype.toString的原因分析
2018/12/09 Javascript
浅析Angular 实现一个repeat指令的方法
2019/07/21 Javascript
node.js制作一个简单的登录拦截器
2020/02/10 Javascript
Python os模块介绍
2014/11/30 Python
分享一下Python 开发者节省时间的10个方法
2015/10/02 Python
Python根据已知邻接矩阵绘制无向图操作示例
2018/06/23 Python
python将处理好的图像保存到指定目录下的方法
2019/01/10 Python
win10下opencv-python特定版本手动安装与pip自动安装教程
2020/03/05 Python
keras自定义回调函数查看训练的loss和accuracy方式
2020/05/23 Python
Django微信小程序后台开发教程的实现
2020/06/03 Python
从Pytorch模型pth文件中读取参数成numpy矩阵的操作
2021/03/04 Python
澳大利亚第一的设计师礼服租赁网站:GlamCorner
2017/08/13 全球购物
印度领先的眼镜电子商务网站:Lenskart
2019/12/16 全球购物
外语系毕业生找工作的求职信
2013/11/28 职场文书
初一生物教学反思
2014/01/18 职场文书
《春天来了》教学反思
2014/04/07 职场文书
2014年中秋节活动总结
2014/08/29 职场文书
土木工程专业本科生求职信
2014/10/01 职场文书
上课讲话检讨书范文
2015/05/07 职场文书