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错误提示的关闭方法详解
Jun 23 PHP
分享下PHP register_globals 值为on与off的理解
Sep 26 PHP
php实现zip压缩文件解压缩代码分享(简单易懂)
May 10 PHP
PHP多线程类及用法实例
Dec 03 PHP
ecshop实现smtp发送邮件
Feb 03 PHP
php简单定时执行任务的实现方法
Feb 23 PHP
php过滤所有的空白字符(空格、全角空格、换行等)
Oct 27 PHP
PHP CURL或file_get_contents获取网页标题的代码及两者效率的稳定性问题
Nov 30 PHP
POST一个JSON格式的数据给Restful服务实例详解
Apr 07 PHP
PHP laravel中的多对多关系实例详解
Jun 07 PHP
PHP PDOStatement::execute讲解
Jan 31 PHP
PHP的垃圾回收机制代码实例讲解
Feb 27 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/11/15 PHP
js新闻滚动 js如何实现新闻滚动效果
2013/01/07 Javascript
早该知道的7个JavaScript技巧
2013/03/27 Javascript
javascript中数组中求最大值示例代码
2013/12/18 Javascript
JS实现鼠标单击与双击事件共存
2014/03/08 Javascript
jQuery实现的在线答题功能
2015/04/12 Javascript
基于jQuery+Cookie实现的防止刷新的在线考试倒计时
2015/06/19 Javascript
JavaScript实现图片滑动切换的代码示例分享
2016/03/06 Javascript
AngularJs bootstrap搭载前台框架——js控制部分
2016/09/01 Javascript
vue2.0实现倒计时的插件(时间戳 刷新 跳转 都不影响)
2017/03/30 Javascript
最基础的vue.js双向绑定操作
2017/08/23 Javascript
轻松理解vue的双向数据绑定问题
2017/10/30 Javascript
JavaScript实现异步图像上传功能
2018/07/12 Javascript
浅谈Vue初学之props的驼峰命名
2018/07/19 Javascript
JS回调函数原理与用法详解【附PHP回调函数】
2019/07/20 Javascript
node-red File读取好保存实例讲解
2019/09/11 Javascript
vue+element-ui表格封装tag标签使用插槽
2020/06/18 Javascript
vue 实现动态路由的方法
2020/07/06 Javascript
在vue中使用Base64转码的案例
2020/08/07 Javascript
解决vue项目中出现Invalid Host header的问题
2020/11/17 Javascript
[07:40]DOTA2每周TOP10 精彩击杀集锦vol.4
2014/06/25 DOTA
详解python并发获取snmp信息及性能测试
2017/03/27 Python
python使用锁访问共享变量实例解析
2018/02/08 Python
Django用户认证系统 User对象解析
2019/08/02 Python
Python如何将函数值赋给变量
2020/04/28 Python
python切割图片的示例
2020/11/12 Python
python 合并多个excel中同名的sheet
2021/01/22 Python
CSS3中颜色线性渐变实战
2015/07/18 HTML / CSS
针对HTML5的Web Worker使用攻略
2015/07/12 HTML / CSS
RentCars.com巴西:汽车租赁网站
2016/08/22 全球购物
英国助听器购物网站:Hearing Direct
2018/08/21 全球购物
印度购买眼镜和太阳镜网站:Coolwinks
2018/09/26 全球购物
自主招生自荐信指南
2014/02/04 职场文书
七一建党日演讲稿
2014/09/05 职场文书
2015年银行员工工作总结
2015/04/24 职场文书
导游词之峨眉乐山/兵马俑/北京故宫御花园
2019/09/03 职场文书