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 相关文章推荐
Windows下的PHP5.0详解
Nov 18 PHP
ADODB结合SMARTY使用~超级强
Nov 25 PHP
php学习 字符串课件
Jun 15 PHP
PHP+SQL 注入攻击的技术实现以及预防办法
Dec 29 PHP
完善CodeIgniter在IDE中代码提示功能的方法
Jul 19 PHP
搭建Vim为自定义的PHP开发工具的一些技巧
Dec 11 PHP
php mysqli查询语句返回值类型实例分析
Jun 29 PHP
微信支付开发动态链接Native支付
Jul 12 PHP
PHP删除二维数组中相同元素及数组重复值的方法示例
May 05 PHP
PDO::exec讲解
Jan 28 PHP
php 多个变量指向同一个引用($b = &$a)用法分析
Nov 13 PHP
解决PHP Opcache 缓存刷新、代码重载出现无法更新代码的问题
Aug 24 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+Html+缓存
2006/11/25 PHP
利用PHP实现智能文件类型检测的实现代码
2011/08/02 PHP
apache+codeigniter 通过.htcaccess做动态二级域名解析
2012/07/01 PHP
解析PHP中VC6 X86和VC9 X86的区别及 Non Thread Safe的意思
2013/06/28 PHP
php中get_cfg_var()和ini_get()的用法及区别
2015/03/04 PHP
mysql查找删除重复数据并只保留一条实例详解
2016/09/24 PHP
Yii实现复选框批量操作实例代码
2017/03/15 PHP
PHP7 参数处理机制修改
2021/03/09 PHP
分享27款非常棒的jQuery 表单插件
2011/03/28 Javascript
通过js来制作复选框的全选和不选效果
2014/05/22 Javascript
JavaScript日期时间与时间戳的转换函数分享
2015/01/31 Javascript
详解Node.js中exports和module.exports的区别
2017/04/19 Javascript
jQuery实现的form转json经典示例
2017/10/10 jQuery
JS+HTML实现的圆形可点击区域示例【3种方法】
2018/08/01 Javascript
深入浅析var,let,const的异同点
2018/08/07 Javascript
微信小程序模板template简单用法示例
2018/12/04 Javascript
关于Vue Router中路由守卫的应用及在全局导航守卫中检查元字段的方法
2018/12/09 Javascript
angularjs实现table表格td单元格单击变输入框/可编辑状态示例
2019/02/21 Javascript
vue项目使用.env文件配置全局环境变量的方法
2019/10/24 Javascript
jQuery实现简易QQ聊天框
2020/02/10 jQuery
Vue使用Ref跨层级获取组件的步骤
2021/01/25 Vue.js
[01:02]DOTA2辉夜杯决赛日 CDEC.Y对阵VG赛前花絮
2015/12/27 DOTA
[48:38]DOTA2亚洲邀请赛 3.31 小组赛 B组 Mineski vs Secret
2018/03/31 DOTA
pymssql ntext字段调用问题解决方法
2008/12/17 Python
Python中的列表知识点汇总
2015/04/14 Python
在Python的Django框架中获取单个对象数据的简单方法
2015/07/17 Python
python爬虫实战之爬取京东商城实例教程
2017/04/24 Python
使用Python和Prometheus跟踪天气的使用方法
2019/05/06 Python
HTML5添加鼠标悬浮音响效果不使用FLASH
2014/04/23 HTML / CSS
财产公证书格式
2014/04/10 职场文书
全国优秀辅导员事迹材料
2014/05/14 职场文书
雷锋电影观后感
2015/06/10 职场文书
基于python的matplotlib制作双Y轴图
2021/04/20 Python
Redis的字符串是如何实现的
2021/10/24 Redis
通过T-SQL语句创建游标与实现数据库加解密功能
2022/03/16 SQL Server
Python find()、rfind()方法及作用
2022/12/24 Python