3

我是 php 新手,我正在尝试编写一个脚本来读取 CSV 文件(file1.csv)并将文件中的单词与 html 文件(file2.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);

解决了这个问题..但是又出现了一个问题:现在每次它替换一个字符串时,它都会在它前面添加单词“Array”。

4

5 回答 5

4

是的,问题出在您的第二次 foreach 中。它应该是这样的:

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

您忘记了密钥,所以它用 $value 替换了 $glossArray 中每个值的每个实例。祝你好运!

于 2010-11-05T14:30:12.310 回答
4

您每次都将整个 $glossArray 传递给 str_replace 。每次执行 str_replace 时,您也会传递初始文件内容,因此最多只能看到一个替换。我认为您想更改为这样的内容:

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

}

由于 str_replace 允许前两个参数的数组(正如另一个用户提到的那样),您也可以执行以下操作而不是循环:

$results = str_replace(array_keys($glossArray), array_values($glossArray), $file);
于 2010-11-05T14:32:36.633 回答
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 一次。

于 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);

请注意,glossArray 的值被提取,并且每个值都与您的字符串连接 - 如果您只是尝试将字符串与数组连接,您将得到一个字符串,而不是一个数组。

于 2010-11-08T13:07:38.307 回答