我正在备考PHP高级考试。练习题说第一次迭代比第二次更好,但我不知道为什么。它们都可以很好地遍历数组的内容。
// 第一个:
foreach($array as $key => &$val) { /* ... */ }
// 第二个:
foreach($array as $key => $val) { /* ... */ }
我正在备考PHP高级考试。练习题说第一次迭代比第二次更好,但我不知道为什么。它们都可以很好地遍历数组的内容。
// 第一个:
foreach($array as $key => &$val) { /* ... */ }
// 第二个:
foreach($array as $key => $val) { /* ... */ }
这个模拟测试说第一次迭代比第二次好。
这不是最好的建议。它们是不同工具,各有所长。
&
意味着按引用传递变量,而不是复制。
当您有一个变量引用时,它类似于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 上的悬空引用示例。
$val
的 &
引用运算符 --> 对 $val
的任何更改都将保存到 $array
中。虽然如此,这并不比示例 #2 更好。