PHP,从数组读取时str_replace的问题

时间:2010-11-05 14:21:09

标签: php foreach str-replace

我是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的内容不变

任何帮助将不胜感激

提前谢谢

纳德

P.S。我根据你的宝贵建议编辑了旧代码的旧代码..现在就像这样......但仍然无法正常工作。

更新:改变foreach:

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

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

5 个答案:

答案 0 :(得分:4)

是的,问题出在你的第二次预告中。它应该是这样的:

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

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

答案 1 :(得分: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);

答案 2 :(得分: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一次。

答案 3 :(得分: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 $文件。

BTW:$counter在做什么?

答案 4 :(得分:0)

新问题的解决方案(这应该是它自己的问题,不是对现有问题的编辑)是array_values返回一个数组,当你用一个字符串连接一个数组时, php插入'Array'而不是值。

$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的值,并且每个值都与您的字符串连接 - 如果您只是尝试将字符串与数组连接,您将得到一个字符串,而不是aray。