2012-10-03 68 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"; 
    } 
}