21

和有什么区别

foreach ($my_array as $my_value) {
}

和:

foreach ($my_array as &$my_value) {
}

?

我可以请你给我两个真实世界的例子,说明什么时候使用一个,什么时候使用另一个?

4

5 回答 5

30

第一个示例创建值的副本,而第二个示例使用对原始值的引用。所以在第一次foreach运行之后,原始数组仍然保持不变。在第二个之后foreach,原始数组可能已被修改,因为它是通过引用处理的。

一些原生 PHP 函数已经以这种方式工作,例如shuffle()重新排列数组的内容。你会注意到这个函数不返回一个数组,你只是调用它:

$myArray = array('foo', 'bar', 'fizz', 'buzz');
shuffle( $myArray );
// $myArray is now shuffled

它发挥了它的魔力,因为它通过引用而不是创建它的副本来处理数组。

然后有些函数不通过引用传递任何东西,而是处理原始值的副本,例如ucwords()返回新的结果字符串:

$myString = "hello world";
$myString = ucwords( $myString );
// $myString is now capitalized

请参阅通过引用传递

于 2010-12-29T15:18:14.150 回答
7

乔纳森的回答很好地描述了它。为了完整起见,这里是你的两个例子:

  1. 只是读取值:

    $my_array = range(0,3);
    foreach ($my_array as $my_value) {
        echo $my_value . PHP_EOL;
    }
    
  2. 向每个元素添加一些数字(从而修改每个值):

    foreach ($my_array as &$my_value) {
        $my_value += 42;
    }
    

    如果不使用&$my_value,则添加对 没有任何影响$my_array。但是您可以不使用引用编写相同的内容:

    foreach($my_array as $key=>$value) {
        $my_array[$key] = $value + 42;
    }
    

    不同之处在于我们直接使用 访问/更改原始值$my_array[$key]

演示

于 2010-12-29T15:28:34.073 回答
0

当您在变量前加上 & 符号时,您正在创建一个“引用”。PHP 引用就像您计算机上的快捷方式或符号链接。您可以创建一个指针变量,它只是相同数据的另一个名称。

我没有看到使用这些有很大的不同,除了你不要复制一个变量来节省内存。当您传递变量时,您可以将引用和引用点传递给原始对象。

于 2010-12-29T15:32:52.447 回答
0

& 使用的真实示例是当您需要用很少的代码行更改数组的内容时

foreach($arrFeed as &$objFeed)
  $objFeed['externalSrc'] = convertToLocalImage($objFeed['externalSrc']);
于 2011-02-11T17:46:33.847 回答
0

当我必须阅读 csv 文件以了解分隔符是什么时,我只使用引用。只需取第一行:

$handle = fopen($file, "r");
$firstLine = fgets($handle);
fclose($handle);

然后用这个可能的分隔符

$delimiters = array(';' => 0,',' => 0,"\t" => 0,"|" => 0);

通过引用计数什么是最常用的

foreach ($delimiters as $delimiter => &$count) {
    $count = count(str_getcsv($firstLine, $delimiter));
}
$delimiter =  array_search(max($delimiters), $delimiters);
于 2020-01-29T09:05:56.277 回答