0

処理しなければならないファイルの行を含む配列がありました。配列の各要素はファイルの行でした。処理後、ファイルを内破し、書き出して使用します。

これを使おうとしたところ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);

これはうまくいきました。

4

2 に答える 2

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);
于 2012-10-03T21:52:20.327 に答える
0

最初の例では、文字列のコピーを変更しています。 $thisLine配列内の要素への参照ではなく、配列要素のコピーです。

2 番目の例では、配列を直接変更しています。foreach を使用できますが、配列の参照に戻る場合のみです。

foreach ($fileArray as $key => $thisLine) {
    if ( condition ) {
        $fileArray[$key] = "changed state";
    }
}
于 2012-10-03T21:52:53.683 に答える