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 相关文章推荐
IIS6.0+PHP5.x+MySQL5.x+Zend3.0x+GD+phpMyAdmin2.8x通用安装实例(已经完成)
Dec 06 PHP
收集的二十一个实用便利的PHP函数代码
Apr 22 PHP
PHP开发不能违背的安全规则 过滤用户输入
May 01 PHP
php中经典方法实现判断多维数组是否为空
Oct 23 PHP
使用cookie实现统计访问者登陆次数
Jun 08 PHP
简单的php新闻发布系统教程
May 09 PHP
PHP获取MySql新增记录ID值的3种方法
Jun 24 PHP
ThinkPHP自动填充实现无限级分类的方法
Aug 22 PHP
使用GDB调试PHP代码,解决PHP代码死循环问题
Mar 02 PHP
PHP操作MySQL的mysql_fetch_* 函数的常见用法教程
Dec 25 PHP
PHP中文字符串截断无乱码解决方法
Oct 10 PHP
Yii框架函数简单用法分析
Sep 09 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调用数据库的存贮过程!
2006/10/09 PHP
wamp下修改mysql访问密码的解决方法
2013/05/07 PHP
PHP7正式版测试,性能惊艳!
2015/12/08 PHP
php array_slice 取出数组中的一段序列实例
2016/11/04 PHP
thinkPHP5.0框架独立配置与动态配置方法
2017/03/17 PHP
mouse_on_title.js
2006/08/25 Javascript
js创建数据共享接口——简化框架之间相互传值
2011/10/23 Javascript
javascript针对DOM的应用分析(二)
2012/04/15 Javascript
解决js正则匹配换行问题实现代码
2012/12/10 Javascript
Jquery插件easyUi表单验证提交(示例代码)
2013/12/30 Javascript
js菜单点击显示或隐藏效果的简单实例
2014/01/13 Javascript
jQuery制作简洁的多级联动Select下拉框
2014/12/23 Javascript
详解axios在node.js中的post使用
2017/04/27 Javascript
JavaScript事件处理程序详解
2017/09/19 Javascript
vue-router的HTML5 History 模式设置
2018/09/08 Javascript
js实现倒计时器自定义时间和暂停
2019/02/25 Javascript
Vue的H5页面唤起支付宝支付功能
2019/04/18 Javascript
vue组件三大核心概念图文详解
2019/05/30 Javascript
Nuxt.js实战和配置详解
2019/08/05 Javascript
解决vue初始化项目时,一直卡在Project description上的问题
2019/10/31 Javascript
浅析vue cli3 封装Svgicon组件正确姿势(推荐)
2020/04/27 Javascript
Layui弹框中数据表格中可双击选择一条数据的实现
2020/05/06 Javascript
Python实现的一个找零钱的小程序代码分享
2014/08/25 Python
深入源码解析Python中的对象与类型
2015/12/11 Python
python 遍历字符串(含汉字)实例详解
2017/04/04 Python
Python中实现最小二乘法思路及实现代码
2018/01/04 Python
批量将ppt转换为pdf的Python代码 只要27行!
2018/02/26 Python
浅谈pandas用groupby后对层级索引levels的处理方法
2018/11/06 Python
Python 确定多项式拟合/回归的阶数实例
2018/12/29 Python
Python参数传递实现过程及原理详解
2020/05/14 Python
新手学习Python2和Python3中print不同的用法
2020/06/09 Python
HTML5本地存储和本地数据库实例详解
2017/09/05 HTML / CSS
小学生家长评语大全
2014/02/10 职场文书
小学美术教学反思
2016/02/17 职场文书
理解python中装饰器的作用
2021/07/21 Python
面试官问我Mysql的存储引擎了解多少
2022/08/05 MySQL