和有什么区别
foreach ($my_array as $my_value) {
}
和:
foreach ($my_array as &$my_value) {
}
?
我可以请你给我两个真实世界的例子,说明什么时候使用一个,什么时候使用另一个?
第一个示例创建值的副本,而第二个示例使用对原始值的引用。所以在第一次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
请参阅通过引用传递。
乔纳森的回答很好地描述了它。为了完整起见,这里是你的两个例子:
只是读取值:
$my_array = range(0,3);
foreach ($my_array as $my_value) {
echo $my_value . PHP_EOL;
}
向每个元素添加一些数字(从而修改每个值):
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]
。
当您在变量前加上 & 符号时,您正在创建一个“引用”。PHP 引用就像您计算机上的快捷方式或符号链接。您可以创建一个指针变量,它只是相同数据的另一个名称。
我没有看到使用这些有很大的不同,除了你不要复制一个变量来节省内存。当您传递变量时,您可以将引用和引用点传递给原始对象。
& 使用的真实示例是当您需要用很少的代码行更改数组的内容时
foreach($arrFeed as &$objFeed)
$objFeed['externalSrc'] = convertToLocalImage($objFeed['externalSrc']);
当我必须阅读 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);