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数组对比函数,存在交集则返回真,否则返回假
Feb 03 PHP
php写的简易聊天室代码
Jun 04 PHP
PHP中根据IP地址判断城市实现城市切换或跳转代码
Sep 04 PHP
php生成二维码的几种方式整理及使用实例
Jun 03 PHP
探讨如何把session存入数据库
Jun 07 PHP
php导入csv文件碰到乱码问题的解决方法
Feb 10 PHP
PHP制作百度词典查词采集器
Jan 29 PHP
启用Csrf后POST数据时出现的400错误
Jul 05 PHP
如何解决PHP使用mysql_query查询超大结果集超内存问题
Mar 14 PHP
PHP并发查询MySQL的实例代码
Aug 09 PHP
PHP实现统计所有字符在字符串中出现次数的方法
Oct 17 PHP
PHP7内核之Reference详解
Mar 14 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
Discuz! 5.0.0论坛程序中加入一段js代码,让会员点击下载附件前自动弹出提示窗口
2007/04/18 PHP
有关JSON以及JSON在PHP中的应用
2010/04/09 PHP
jquery 表单进行客户端验证demo
2009/08/24 Javascript
js中关于String对象的replace使用详解
2011/05/24 Javascript
JavaScript高级程序设计 学习笔记 js高级技巧
2011/09/20 Javascript
js正则表达式的使用详解
2013/07/09 Javascript
地址栏传递中文参数乱码在js里用escape转码
2013/08/28 Javascript
利用javascript判断文件是否存在
2013/12/31 Javascript
理解jQuery stop()方法
2014/11/21 Javascript
Javascript获取表单名称(name)的方法
2015/04/02 Javascript
JQuery中Text方法用法实例分析
2015/05/18 Javascript
PHP结合jQuery实现红蓝投票功能特效
2015/07/22 Javascript
javascript中日期函数new Date()的浏览器兼容性问题
2015/09/05 Javascript
jquery制作图片时钟特效
2020/03/30 Javascript
JQuery点击行tr实现checkBox选中的简单实例
2016/05/26 Javascript
浅谈JS中的!=、== 、!==、===的用法和区别
2016/09/24 Javascript
React中上传图片到七牛的示例代码
2017/10/10 Javascript
react-navigation 如何判断用户是否登录跳转到登录页的方法
2017/12/01 Javascript
解决vue数组中对象属性变化页面不渲染问题
2018/08/09 Javascript
使用webpack打包后的vue项目如何正确运行(express)
2018/10/26 Javascript
详解webpack4之splitchunksPlugin代码包分拆
2018/12/04 Javascript
微信小程序实现3D轮播图效果(非swiper组件)
2019/09/21 Javascript
python中获得当前目录和上级目录的实现方法
2017/10/12 Python
Django实战之用户认证(用户登录与注销)
2018/07/16 Python
使用 Django Highcharts 实现数据可视化过程解析
2019/07/31 Python
django框架中间件原理与用法详解
2019/12/10 Python
Python作用域与名字空间原理详解
2020/03/21 Python
Python如何生成xml文件
2020/06/04 Python
如何用Python 实现全连接神经网络(Multi-layer Perceptron)
2020/10/15 Python
CSS3制作Dropdown下拉菜单的方法
2015/07/18 HTML / CSS
光荣入党自我鉴定
2014/01/22 职场文书
校园奶茶店创业计划书
2014/01/23 职场文书
高中同学会活动方案
2014/08/14 职场文书
董事长年会致辞
2015/07/29 职场文书
idea以任意顺序debug多线程程序的具体用法
2021/08/30 Java/Android
windows server2008 开启端口的实现方法
2022/06/25 Servers