这两种数组迭代方式有什么区别?

5

我正在备考PHP高级考试。练习题说第一次迭代比第二次更好,但我不知道为什么。它们都可以很好地遍历数组的内容。

// 第一个:

 foreach($array as $key => &$val) { /* ... */ }

// 第二个:

foreach($array as $key => $val) { /* ... */ }

是的,这往往会让人更加困惑:https://dev59.com/PljUa4cB1Zd3GeqPNg_Q - Andreas Wong
我建议你阅读这篇文章 - BlitZ
3
什么考试?我不敢相信这是来自ZCE的。 - Mark Baker
2个回答

10

这个模拟测试说第一次迭代比第二次好。

这不是最好的建议。它们是不同工具,各有所长。

&意味着按引用传递变量,而不是复制。

当您有一个变量引用时,它类似于C语言中的指针。访问变量可以让您访问原始变量的内存位置,使您可以通过不同的标识符修改其值。

// Some variable.
$a = 42;

// A reference to $a.
// & operator returns a reference.
$ref = &$a;

// Assignment of $ref.
$ref = "fourty-two";

// $a itself has changed, through
// the reference $ref.
var_dump($a); // "fourty-two"

CodePad 上的参考示例。

foreach 的正常行为是在关联块中提供一个副本。这意味着您可以自由地重新分配它,而不会影响数组成员(对于始终是引用的变量(例如类实例)不适用此规则)。

CodePad 上的复制示例。

CodePad 上的类实例示例。

foreach 中使用引用有一些副作用,例如一个悬空的 $val 引用最后被迭代的值,这可能会在以后被意外修改并影响数组。

CodePad 上的悬空引用示例。


谢谢您的帮助!您能再多解释一下“引用而非复制”吗?我只了解&可以将变量写入另一个变量中,例如$Foo2 = &$Foo1; - Willow
我明白了。所以如果我使用&,我可以通过调用$val在foreach循环外部编辑数组?非常感谢!您在澄清此问题方面做得非常出色。 - Willow
我在参加PHP UNIT测试之前仍需要更多的练习和学习。您有哪些好的网站建议可以帮助我学习? - Willow
1
@Willow,这个问题通常会带来更多的问题而不是有用的东西。至于了解PHP,阅读大量的Stack Overflow问题,并在你尽力后遇到困难时寻求帮助。 - alex

1
第一个示例包括对变量 $val& 引用运算符 --> 对 $val 的任何更改都将保存到 $array 中。虽然如此,这并不比示例 #2 更好。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接