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脚本的10个技巧(8)
Oct 09 PHP
PHP编程中字符串处理的5个技巧小结
Nov 13 PHP
php将fileterms函数返回的结果变成可读的形式
Apr 21 PHP
php在多维数组中根据键名快速查询其父键以及父键值的代码
May 07 PHP
关于Iframe如何跨域访问Cookie和Session的解决方法
Apr 15 PHP
php中的filesystem文件系统函数介绍及使用示例
Feb 13 PHP
分享自定义的几个PHP功能函数
Apr 15 PHP
ThinkPHP函数详解之M方法和R方法
Sep 10 PHP
PHP编程实现csv文件导入mysql数据库的方法
Apr 29 PHP
CI(CodeIgniter)框架中URL特殊字符处理与SQL注入隐患分析
Feb 28 PHP
浅谈php调用python文件
Mar 29 PHP
laravel实现登录时监听事件,添加登录用户的记录方法
Sep 30 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
php5新改动之短标记启用方法
2008/09/11 PHP
PHP中文件上传的一个问题
2010/09/04 PHP
PHP冒泡排序算法代码详细解读
2011/07/17 PHP
PHP针对JSON操作实例分析
2015/01/12 PHP
PHP实现恶意DDOS攻击避免带宽占用问题方法
2015/05/27 PHP
PHP获取文件扩展名的常用方法小结【五种方式】
2018/04/27 PHP
可输入的下拉框
2006/06/19 Javascript
JavaScript之HTMLCollection接口代码
2011/04/27 Javascript
调试代码导致IE出错的避免方法
2014/04/04 Javascript
两个多选select(multiple左右)添加、删除选项和取值实例
2014/05/12 Javascript
javascript中Array()数组函数详解
2015/08/23 Javascript
js实现的黑背景灰色二级导航菜单效果代码
2015/08/24 Javascript
使用堆实现Top K算法(JS实现)
2015/12/25 Javascript
angular2使用简单介绍
2016/03/01 Javascript
Bootstrap和Java分页实例第一篇
2016/12/23 Javascript
angularjs实现上拉加载和下拉刷新数据功能
2017/06/12 Javascript
jQuery、layer实现弹出层的打开、关闭功能
2017/06/28 jQuery
详解自定义ajax支持跨域组件封装
2018/02/08 Javascript
React组件重构之嵌套+继承及高阶组件详解
2018/07/19 Javascript
vue router 通过路由来实现切换头部标题功能
2019/04/24 Javascript
新手快速入门微信小程序组件库 iView Weapp
2019/06/24 Javascript
Element 默认勾选表格 toggleRowSelection的实现
2019/09/04 Javascript
javascript中导出与导入实现模块化管理教程
2020/12/03 Javascript
python操作openpyxl导出Excel 设置单元格格式及合并处理代码实例
2019/08/27 Python
PyCharm使用之配置SSH Interpreter的方法步骤
2019/12/26 Python
pygame实现飞机大战
2020/03/11 Python
python实现马丁策略回测3000只股票的实例代码
2021/01/22 Python
美国受欢迎的女性牛仔裤品牌:DL1961
2016/11/12 全球购物
欧洲最大的滑雪假期供应商之一:Sunweb Holidays
2018/01/06 全球购物
荷兰领先的百货商店:De Bijenkorf
2018/10/17 全球购物
UNIONBAY官网:美国青少年服装品牌
2019/03/26 全球购物
戴尔荷兰官方网站:Dell荷兰
2020/10/04 全球购物
几道PHP的面试题
2012/05/19 面试题
财会专业大学生求职信
2014/09/26 职场文书
小学运动会报道稿
2015/07/22 职场文书
Android实现获取短信验证码并自动填充
2023/05/21 Java/Android