foreach是否在输入数组的副本上执行操作?


Does foreach do its work on a copy of the input array?

我一直在研究一些考题。关于数组迭代的一个问题。

遍历$myarray数组的最佳方法是什么您想要修改每个元素的值吗?

<?php
$myarray = array ("My String",
"Another String",
"Hi, Mom!");
?>

。使用for循环

B。使用foreach循环

C。使用while循环

D。使用do…while循环

E。没有办法实现这个目标

我的回答是"当然是foreach循环"。但是根据答题纸:

通常,foreach语句是最合适的构造遍历数组。然而,因为我们被要求这么做修改数组中的每个元素,此选项不可用,因为Foreach操作数组的副本,因此会得到增加了开销。虽然while循环或do…while循环可以工作,因为数组是按顺序索引的,所以最好使用for语句适合任务,使答案A正确。

我仍然认为每一个都是最好的。只要我使用key,我就可以修改值
<?php
foreach($myarray as $k=>$v){
    $myarray[$k] = "Modified ".$v;
}
?>

我错过什么了吗?

根据答题纸:

这个选项不可用,因为foreach操作的是数组的副本,因此会导致额外的开销

无稽之谈。

如果需要证明,可以通过引用取值:

<?php
foreach($myarray as &$v){
    $v = "Modified ".$v;
}
?>
我仍然认为每一个都是最好的。只要我使用它与键,我可以修改值。

我同意。

我错过什么了吗?

http://php.net/manual/en/function.array-walk.php

array_walk($myarray, "modify");
function modify($value)
{
  $value = "modified " . $value;
}

如果你想将此应用于多个数组,你甚至可以使用array_map()

你也可以做

<?php
foreach($myarray as &$v){
    $v = "Modified ".$v;
}
?>

或者在某些情况下,如果您有一个功能足以完成任务:

$myarray = array_map( "trim", $myarray );

它将对数组中的每个元素应用trim函数,并返回修改后的版本