【问题标题】:PHP, problem with str_replace while reading from arrayPHP,从数组读取时出现 str_replace 问题
【发布时间】:2010-11-05 14:21:08
【问题描述】:

我是 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 的内容没有改变

任何帮助将不胜感激

提前谢谢你

纳德

附:在您的宝贵建议之后,我用新代码编辑了旧代码..现在是这样..但仍然不起作用。

更新:用 :

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

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

【问题讨论】:

  • 该代码示例看起来确实可以解析。第 9 行或第 10 行似乎缺少某些内容。
  • +1 为什么要投反对票? OP 已尝试自行解决此问题,并且目前正在展示他的工作。
  • 您不能将字符串连接到 array_values($glossArray) 的乘积。您将字符串与数组连接起来,因此您会得到不希望的行为。您应该连接“手段”。执行时的字符串 = " 表示 ".$line_of_text[1];早些时候。

标签: php foreach str-replace


【解决方案1】:

您每次都将整个 $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);

【讨论】:

  • +1 for the array_keys/array_values str_replace.... 虽然 OP 可以通过 CSV 在他的初始循环中构建一个 from 和 a to 数组
  • 那是完美的..但问题是它会在每次替换时添加单词 Array ..
  • @user498401:看起来在您编辑的问题中您正在这样做:>> $results = "cioe".array_values($glossArray)
  • 是的 .. 取出后效果很好 .. 非常感谢。
【解决方案2】:

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

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

您忘记了密钥,因此它将 $glossArray 中每个值的每个实例都替换为 $value。祝你好运!

【讨论】:

  • 谢谢你..我更了解它是如何工作的..但问题仍然存在......
【解决方案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。

【讨论】:

    【解决方案4】:

    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 在做什么?

    【讨论】:

    • 在阅读 CSV 文件后尝试 var_dump($glossArray) 以确保您的词汇表看起来应该是这样。
    • 试过了.. 给了我键 => 值对...看起来效果很好。
    • 在您编辑的代码中,您仍然会覆盖每个 str_replace 的 $results!
    【解决方案5】:

    你的新问题的解决方案(这应该是它自己的问题,不是对现有问题的编辑)是 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 的值已被提取,并且每个值都与您的字符串连接 - 如果您只是尝试将字符串与数组连接,您将得到一个字符串,而不是一个数组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-22
      • 1970-01-01
      • 1970-01-01
      • 2015-08-18
      • 2015-07-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多