这两个数组迭代有什么区别?

时间:2013-05-15 06:48:35

标签: php arrays loops object iteration

我正在学习PHP进行高级考试。练习测试说第一次迭代比第二次迭代更好。我不明白为什么。他们都很好地迭代数组的内容。

//第一个:

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

//第二个:

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

2 个答案:

答案 0 :(得分: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上的参考示例。

答案 1 :(得分:1)

第一个示例包含&的{​​{1}}引用运算符 - >对$val的任何更改都将保存到$val

但这并不比示例#2“更好”。