2012-10-03 55 views
0

我有一个数组,其中包含我必须处理的文件的行,数组的每个元素都是文件的一行。处理完毕后,我将文件解压,写出来并使用它。for vs foreach - 引用数组元素

当我尝试使用foreach为此,它不起作用。我怀疑它是在创建元素的副本,而不是直接引用该元素,所以使用了for循环代替,这确实奏效。

我的问题是,有没有办法在这种情况下使用foreach循环,或者当重新定义数组的元素时,您总是必须使用for循环?

示例代码:

$fileArray = file('blah.txt'); 
foreach ($fileArray as $thisLine) { 
    if (condition) { 
     $thisLine = "changed state"; 
    } 
} 
$newFileArray = implode('',$fileArray); 

没有工作VS:

$fileArray = file('blah.txt'); 
for ($x=0;$x<count($fileArray);$x++) { 
    if (condition) { 
     $fileArray[$x] = "changed state"; 
    } 
} 
$newFileArray = implode('',$fileArray); 

后就正常了。

+1

你可以使用foreach,但如果你想引用变量的使用和infront。在您的示例中,foreach($ fileArray as&$ fileLine){' –

+1

]永远不要忘记在foreach循环后直接引用此引用,否则将破坏数据的优势:'unset($ fileLine) – Sven

回答

3
$fileArray = file('blah.txt'); 
foreach ($fileArray as $key => $thisLine) { 
    if (condition) { 
     $fileArray[$key] = "changed state"; 
    } 
} 
$newFileArray = implode('',$fileArray); 

或引用传递直接:

$fileArray = file('blah.txt'); 
foreach ($fileArray as &$thisLine) { 
    if (condition) { 
     $thisLine = "changed state"; 
    } 
} 
$newFileArray = implode('',$fileArray); 
0

在你的第一个例子,你改变一个字符串的副本。 $thisLine不是对数组中元素的引用,而是数组元素的副本。

在你的第二个例子中,你直接改变了数组。你可以使用foreach,但只有当你回到引用数组时:

foreach ($fileArray as $key => $thisLine) { 
    if (condition) { 
     $fileArray[$key] = "changed state"; 
    } 
}