php foreach 内存,php foreach 中使用引用不当,撑爆内存

今天一个同事,写了一段类似下面的代码:

$a = array(1, 2, 3);

foreach($a as $k => &$v)

{

$a[] = $v;

}

默认的 128M 内存直接被撑爆了, 原因很简单:每循环一次,都将 $a 数组增加一个 k-v,导致陷入一个无限循环中, 内存自然不够用了。

关键不是这里, 关键是将 $k => &$v 改为 $k => $v 后, 这个循环又可以正常执行了。

查阅 PHP 手册中, 有一句:

"Note:除非数组是被引用,foreach 所操作的是指定数组的一个拷贝,而不是该数组本身。"

是否因为第二种写法 的 foreach 操作的是数组 $a 的拷贝,而第一种写法操作的是 $a 的引用或者其本身?

否则这个逻辑错误应该是两种写法都会体现出来才对。

回复内容:

今天一个同事,写了一段类似下面的代码:

$a = array(1, 2, 3);

foreach($a as $k => &$v)

{

$a[] = $v;

}

默认的 128M 内存直接被撑爆了, 原因很简单:每循环一次,都将 $a 数组增加一个 k-v,导致陷入一个无限循环中, 内存自然不够用了。

关键不是这里, 关键是将 $k => &$v 改为 $k => $v 后, 这个循环又可以正常执行了。

查阅 PHP 手册中, 有一句:

"Note:除非数组是被引用,foreach 所操作的是指定数组的一个拷贝,而不是该数组本身。"

是否因为第二种写法 的 foreach 操作的是数组 $a 的拷贝,而第一种写法操作的是 $a 的引用或者其本身?

否则这个逻辑错误应该是两种写法都会体现出来才对。

解答

首先,肯定你的回答,原因也跟你说的一样,php里引用传递和值传递的区别。至于调试,我建议使用Xdebug调试一下即可,打印数组的zval结构体,代码如下:

&$value) {

$arr[] = $value;

xdebug_debug_zval('arr');

echo "\n";

}

可以看到zval的结构体的成员:arr: (refcount=3, isref=1),isref字段为1说明是arr的引用

新疑问

我本该安心的复习算法,准备各种校招笔试的,但是无奈测试一下一个元素的数组,代码:

&$value) {

$arr[] = $value;

xdebug_debug_zval('arr');

echo "\n";

}

这个并没有像我想得一样进入死循环,考虑是否是foreach的内部实现机制造成的,求解释!!

相关标签:php

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值