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显示Facebook的粉丝数量方法
Jan 08 PHP
PHP中使用imagick实现把PDF转成图片
Jan 26 PHP
PHP常见的6个错误提示及解决方法
Jul 07 PHP
PHP实现在对象之外访问其私有属性private及保护属性protected的方法
Nov 20 PHP
PHP让数组中有相同值的组成新的数组实例
Dec 31 PHP
PHP从零开始打造自己的MVC框架之路由类实现方法分析
Jun 03 PHP
Laravel统计一段时间间隔的数据方法
Oct 09 PHP
在laravel中使用with实现动态添加where条件
Oct 10 PHP
laravel 获取当前url的别名方法
Oct 11 PHP
php 输出缓冲 Output Control用法实例详解
Mar 03 PHP
PHP设计模式入门之迭代器模式原理与实现方法分析
Apr 26 PHP
PHP7原生MySQL数据库操作实现代码
Jul 03 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 获得汉字拼音首字母的函数
2009/08/01 PHP
无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装最快的解决办法
2010/08/01 PHP
php常用文件操作函数汇总
2014/11/22 PHP
php中随机函数mt_rand()与rand()性能对比分析
2014/12/01 PHP
php中preg_replace_callback函数简单用法示例
2016/07/21 PHP
php简单实现单态设计模式的方法分析
2017/07/28 PHP
常用参考资料(手册)下载或者链接
2006/07/22 Javascript
jQuery对html元素取值与赋值的方法
2013/11/20 Javascript
javascript生成随机数的方法
2014/05/16 Javascript
浅谈Javascript变量作用域问题
2014/12/16 Javascript
深入学习JavaScript对象
2015/10/13 Javascript
常用的JQuery函数及功能小结
2016/03/24 Javascript
javascript中数组和字符串的方法对比
2016/07/20 Javascript
你知道setTimeout是如何运行的吗?
2016/08/16 Javascript
jQuery中的siblings()是什么意思(推荐)
2016/12/29 Javascript
详解Angular2 关于*ngFor 嵌套循环
2017/05/22 Javascript
基于angular2 的 http服务封装的实例代码
2017/06/29 Javascript
vue-router 路由基础的详解
2017/10/17 Javascript
JavaScript的Object.defineProperty详解
2018/07/09 Javascript
vue2.0+vue-router构建一个简单的列表页的示例代码
2019/02/13 Javascript
服务端预渲染之Nuxt(使用篇)
2019/04/08 Javascript
JS代码优化的8点建议
2020/02/04 Javascript
Python sys.argv用法实例
2015/05/28 Python
python实现的分层随机抽样案例
2020/02/25 Python
浅谈Keras中shuffle和validation_split的顺序
2020/06/19 Python
Python 连接 MySQL 的几种方法
2020/09/09 Python
CSS Grid布局教程之网格单元格布局
2014/12/30 HTML / CSS
碧欧泉Biotherm加拿大官方网站:法国高端护肤品牌
2019/10/18 全球购物
文言文形式的学生求职信
2013/12/03 职场文书
简单的大学生自我鉴定
2014/02/18 职场文书
机械电子工程专业自荐书
2014/06/10 职场文书
2014最新离职证明范本
2014/09/12 职场文书
2014第二批党的群众路线教育实践活动对照检查材料思想汇报
2014/09/18 职场文书
Html5新增了哪些功能
2021/04/16 HTML / CSS
据Python爬虫不靠谱预测可知今年双十一销售额将超过6000亿元
2021/11/11 Python
Innodb存储引擎中的后台线程详解
2022/04/03 MySQL