PHP - foreach循环中变量前的和号

65

可能重复:
参考 - PHP 中这个符号的含义是什么?

我需要知道为什么在 foreach 循环中要在变量前使用 ampersand 符号。

foreach ($wishdets as $wishes => &$wishesarray) {
    foreach ($wishesarray as $categories => &$categoriesarray) {

    }
}

4
这里需要注意的是,循环变量会泄露到循环范围之外(因为 PHP 没有块作用域,这让事情更有趣)。因此,如果你稍后给循环变量赋值,就会破坏数组。即使你在另一个循环中将其用作循环变量,也可能发生这种情况,导致非常“有趣”的错误。解决方法是在循环结束后使用unset()函数来删除循环变量。 - MightyPork
$array = array(1, 2); foreach ($array as $value) { $value++; } print_r($array); // 1, 2 因为我们遍历的是值的副本,这意味着它是按引用传递而不是数组值,它的变量将影响原始数组值。$array = array(1, 2, 3, 4,5); echo "<pre>"; print_r($array);foreach ($array as &$value) { $value = $value*2; } echo "<pre>"; print_r($array); // 2, 4,6,8,10 因为我们遍历了对数组实际值的引用 - Vikas kumar
4个回答

82

这个示例将向你展示它们之间的区别。

$array = array(1, 2);
foreach ($array as $value) {
    $value++;
}
print_r($array); // 1, 2 because we iterated over copy of value

foreach ($array as &$value) {
    $value++;
}
print_r($array); // 2, 3 because we iterated over references to actual values of array

请查阅此处的PHP文档:http://pl.php.net/manual/en/control-structures.foreach.php


“按引用传递”语法是否经常会导致错误,例如:“无法创建对/从字符串偏移量的引用”? - Razvan Zamfir

29
这意味着它是按引用传递而不是按值传递...也就是说,对变量的任何操作都会影响原始对象。这与按值传递不同,按值传递时,任何修改都不会影响原始对象。
这个问题在stackoverflow上被问了很多次。

4
补充一点,"按引用传递"意味着它引用的是被引用变量的相同分配的内存块。 - Prof
2
与“按值传递”相反,这意味着PHP会在新的内存块中创建变量的副本。 - Kaii
在问题示例代码中,引用传递有两种方式,我都进行了概述 - hakre
9
如果你知道"这个问题在StackOverflow上已经被问过很多次",为什么还要回答它呢?找到一个合适的重复问题并作为评论提供(或者一旦你达到了3k声望就可以选择关闭它)。 - Gordon

9

它用于将数组的单个实例中的更改应用到主数组中。

例如:

//现在更改不会影响数组 $wishesarray

foreach ($wishesarray as $id => $categoriy) {
      $categoriy++;
}
print_r($wishesarray); //It'll same as before..

现在所做的更改也将反映在数组 $wishesarray 中。
foreach ($wishesarray as $id => &$categoriy) {
      $categoriy++;
}
print_r($wishesarray); //It'll have values all increased by one..

3

针对您问题中的代码,无法给出具体的答案,因为内部的foreach循环为空。

从您的代码中看到,内部的foreach是在引用上进行迭代,而不是常规的方式。

我建议您阅读foreach PHP 手册页面,它涵盖了所有四种情况:

foreach($standard as $each);

foreach($standard as &$each); # this is used in your question

$reference = &$standard;
foreach($reference as $each);

$reference = &$standard;
foreach($reference as &$each); # this is used in your question

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