当前位置: 首页 > 知识库问答 >
问题:

当我们没有在循环中修改数组时,为什么foreach要复制数组?[副本]

党星鹏
2023-03-14

在一篇博客文章“PHP Internals:When does foreach copy”中,NikiC指出在下面这样的代码中:

$array = range(0, 100000);
foreach ($array as $key => $value) {
    xdebug_debug_zval('array'); // array is not copied, only refcount is increased
}
$array = range(0, 100000); // line 1
test($array);
function test($array) { 
    foreach ($array as $key => $value) { // line 4
        xdebug_debug_zval('array'); // array is copied, refcount not increased
        // ...
    }
}

共有1个答案

水睿
2023-03-14

这是因为在第二种情况下,$array通过值传递给函数test()。因此,$数组的一个副本在函数中生成,foreach()在该副本上工作。如果通过引用test()函数传递$数组,情况就不同了。

有关按值传递与按引用传递的信息,请参阅此问题

 类似资料:
  • 在我使用的一个类中,他们给出了一个用循环编辑数组内容的示例。 类示例: 我的代码: 我尝试运行语句,但没有成功。我联系了他们的“现场帮助”,但他们没有什么帮助。谁能告诉我我在这里没有看到什么吗?

  • 为什么这里两个列表的大小都是零?按照我的理解,< code>aList1.size()应该是< code>0,而< code>aList2.size()应该是< code>1。

  • 为什么我的parkList变量在.each函数外是空的,而我在循环外声明了它并在循环期间填充了它的值...并且循环成功执行?

  • 然后用Gson lib将响应转换为我们需要的对象。 这来自Square/OKHTTP文档: 它的请求/响应API是用流畅的构建器和不变性设计的。它同时支持同步阻塞调用和带有回调的异步调用

  • 问题内容: 我正在尝试使用for循环在数组内创建一个数组-这是我的代码: 不幸的是,这给了我一个 “解析错误:语法错误,意外的T_CONSTANT_ENCAPSED_STRING,预期为’)’” 对于该行: 对于出了什么问题,我有些茫然-非常感谢您的帮助。$ clients是在其他地方定义的,所以这不是问题。 问题答案: 那是无效的语法。您必须首先构建数组的“父”部分。然后使用foreach循环添