foreach是否在输入数组的副本上完成工作?

时间:2011-11-10 12:33:25

标签: php

我一直在研究一些测试题。关于数组迭代的一个问题。这是:

  

假设,迭代$ myarray数组的最佳方法是什么   你想像你一样修改每个元素的值吗?

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

一个。使用for循环

     

B中。使用foreach循环

     

℃。使用while循环

     

d。使用do ... while循环

     

电子。没有办法实现这个目标

我的答案是“当然是foreach循环”。但根据答案表:

  

通常,foreach语句是最合适的构造   迭代一个数组。但是,因为我们被要求   修改数组中的每个元素,此选项不可用,因为   foreach在数组的副本上工作,因此会导致   增加了开销。虽然while循环或do ... while循环可能有效,   因为数组是顺序索引的,所以for语句最好   适合任务,使答案A正确。

我仍然认为foreach是最好的。只要我将它与密钥一起使用,我就可以修改值。

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

我错过了什么吗?

3 个答案:

答案 0 :(得分:7)

  

根据答卷:

     
    

此选项不可用,因为foreach在数组的副本上工作,因此会导致额外的开销

  

无意义。

如果您需要证明,可以参考以下值:

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

我仍然认为foreach是最好的。只要我使用密钥,我就可以修改值。

我同意。

  

我错过了什么吗?

没有

答案 1 :(得分:1)

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

array_walk($myarray, "modify");

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

如果要将其应用于多个数组,您甚至可以使用array_map()

答案 2 :(得分:0)

您也可以

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

或者在某些情况下,如果你有一个足以完成这项工作的功能:

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

它将修剪函数应用于数组中的每个元素并返回修改后的版本。