3

私はphpが初めてで、CSVファイル(file1.csv)を読み取り、file2.htmlの単語が一致する場合、ファイル内の単語をhtmlファイル(file2.html)の単語と比較するスクリプトを実行しようとしていますfile1.csvのキー部分を使用すると、一致したキーの値でfile2.htmlの内容を変更する必要があります..

私がこれまでに行ったことはこれです:

$glossArray = array();
$file_handle = fopen("file1.csv", "r");
while (!feof($file_handle) ) {

    $line_of_text = fgetcsv($file_handle, 10000,';');
    $glossArray[$line_of_text[0]] =  $line_of_text[1];
    $counter++;
}
fclose($file_handle);

$file = file_get_contents("file2.html");

foreach($glossArray as $key => $value){
    $results = str_replace($key," means ".$value ,$file);
}

echo $results;

値を反復して変更しようとすると問題が発生すると思います..表示されるのは file2.html の内容のみが変更されていないためです

任意の助けをいただければ幸いです

前もって感謝します

ネーダー

PS あなたの貴重なアドバイスの後、新しいコードで古いコードを編集しました..今はこのようになっています..しかし、まだ機能しません。

更新: foreach を次のように変更します。

$results = str_replace(array_keys($glossArray), "means ".array_values($glossArray), $file);

問題を解決しました..しかし、別の問題が発生しました。文字列を置き換えるたびに、その前に「配列」という単語が追加されます。

4

5 に答える 5

4

毎回 $glossArray 全体を str_replace に渡しています。また、str_replace を実行するたびに初期ファイルの内容を渡しているため、多くても 1 つの置換が表示されます。次のようなものに変更したいと思います。

$results = $file;
foreach($glossArray as $index=>$value)
{
    $results = str_replace($index,$value ,$results);

}

str_replace は最初の 2 つのパラメーターの配列を許可するため (別のユーザーが言及しているように)、ループの代わりに次のようなこともできます。

$results = str_replace(array_keys($glossArray), array_values($glossArray), $file);
于 2010-11-05T14:32:36.633 に答える
4

はい、問題は 2 番目の foreach にあります。次のように表示されます。

foreach($glossArray as $key => $value){
    $results = str_replace($key,$value ,$file);
}

キーを忘れたので、$glossArray のすべての値のすべてのインスタンスが $value に置き換えられます。それでは頑張ってください!

于 2010-11-05T14:30:12.310 に答える
3

読み書きのために file2.html を開いて、その内容を取得するのはなぜですか?

(ところで-これは、厳密なロックを備えたシステムではひどくうまくいかないでしょう)

foreach($glossArray as $value)
{
  $results = str_replace($glossArray,$value ,$file);

これであるべきだと思います

foreach($glossArray as $old=>$new)
{
   $results = str_replace($old, $new, $file);

用語集からペアを 2 つの別々の番号付き配列にロードする方がはるかに効率的ですが、str_replace を 1 回呼び出すだけです。

于 2010-11-05T14:30:24.283 に答える
1

str_replace の最初のパラメーターは$glossArray、配列であり、置換する文字列ではないため、そうすべきではありません。

あなたのCSVファイルには「SEARCH;REPLACE」のようなものが含まれていると思いますか?その場合、次のforeachようになりますforeach ($glossArray as $searchString => $value)

それから試してください

$file = str_replace($searchString, $value ,$file);

それ以外の

$results = str_replace($searchString, $value ,$file);

今のところ$results、すべての str_replace ... echo $file で何度も何度も上書きしているため、完了したら。

ところで:何をしているの$counter

于 2010-11-05T14:26:49.437 に答える
0

あなたの新しい問題(既存の問題の編集ではなく、実際にはそれ自体の問題であるはずです)の解決策は、array_valuesが配列を返し、配列を文字列と連結すると、phpが値の代わりに「配列」を挿入することです。

$results = str_replace(array_keys($glossArray), "means ".array_values($glossArray), $file);

間違っています。代わりにこれを行う必要があります。

$vals = array_values($glossArray);
foreach($vals as $k=>$v)$vals[$k] = 'means '.$v;
$results = str_replace(array_keys($glossArray), $vals, $file);

glosArray の値が抽出され、各値が文字列と連結されていることに注意してください。文字列を配列と連結しようとすると、配列ではなく文字列が得られます。

于 2010-11-08T13:07:38.307 に答える