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中实现图片的锐化
Oct 09 PHP
php中根据某年第几天计算出日期年月日的代码
Feb 24 PHP
php通用防注入程序 推荐
Feb 26 PHP
php _autoload自动加载类与机制分析
Feb 10 PHP
php中拷贝构造函数、赋值运算符重载
Jul 25 PHP
php中用加号与用array_merge合并数组的区别深入分析
Jun 03 PHP
php获取参数的几种方法总结
Feb 18 PHP
MacOS 安装 PHP的图片裁剪扩展Tclip
Mar 25 PHP
windows下安装php的memcache模块的方法
Apr 07 PHP
简单了解将WordPress中的工具栏移到底部的小技巧
Dec 31 PHP
CodeIgniter视图使用注意事项
Jan 20 PHP
thinkPHP事务操作简单案例分析
Oct 17 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手册及PHP编程标准
2006/12/17 PHP
CI框架验证码CAPTCHA辅助函数用法实例
2014/11/05 PHP
Yii入门教程之Yii安装及hello world
2014/11/25 PHP
php计算数组相同值出现次数的代码(array_count_values)
2015/01/20 PHP
php实现简单的语法高亮函数实例分析
2015/04/27 PHP
PHP+Ajax验证码验证用户登录
2016/07/20 PHP
php获取linux命令结果的实例
2017/03/13 PHP
JavaScript调用Activex控件的事件的实现方法
2010/04/11 Javascript
Html中JS脚本执行顺序简单举例说明
2010/06/19 Javascript
JavaScript NodeTree导航栏(菜单项JSON类型/自制)
2013/02/01 Javascript
利用js实现选项卡的特别效果的实例
2013/03/03 Javascript
jQuery模拟超链接点击效果代码
2013/04/21 Javascript
jQuery之自动完成组件的深入解析
2013/06/19 Javascript
jquery左边浮动到一定位置时显示返回顶部按钮
2014/06/05 Javascript
JS实现向表格中动态添加行的方法
2015/03/30 Javascript
JavaScript 定时器 SetTimeout之定时刷新窗口和关闭窗口(代码超简单)
2016/02/26 Javascript
详解nodeJs文件系统(fs)与流(stream)
2018/01/24 NodeJs
浅谈关于iview表单验证的问题
2018/09/29 Javascript
简单了解小程序+node梳理登陆流程
2019/06/24 Javascript
vue过滤器实现日期格式化的案例分析
2020/07/02 Javascript
浅谈Ant Design Pro 菜单自定义 icon
2020/11/17 Javascript
[01:04:14]OG vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
python删除文件示例分享
2014/01/28 Python
Python获取单个程序CPU使用情况趋势图
2015/03/10 Python
python数据预处理之将类别数据转换为数值的方法
2017/07/05 Python
利用python将pdf输出为txt的实例讲解
2018/04/23 Python
详解Python安装scrapy的正确姿势
2018/06/26 Python
python调用外部程序的实操步骤
2019/03/04 Python
详解Python读取yaml文件多层菜单
2019/03/23 Python
django rest framework serializers序列化实例
2020/05/13 Python
pycharm激活码2020最新分享适用pycharm2020最新版亲测可用
2020/11/22 Python
李维斯德国官方网上商店:Levi’s德国
2016/09/10 全球购物
项目施工员岗位职责
2014/03/09 职场文书
集中整治工作方案
2014/05/01 职场文书
学校领导班子四风对照检查材料
2014/09/27 职场文书
Oracle 临时表空间SQL语句的实现
2021/09/25 Oracle