PHP, проблема с str_replace при чтении из массива - PullRequest
3 голосов
/ 05 ноября 2010

Я новичок в php и пытаюсь создать скрипт, который читает файл CSV (file1.csv) и сравнивает слова в файле со словами в html-файле (file2.html), если word в 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 без изменений

любая помощь будет оценена

спасибозаранее

Nader

Ps я отредактировал старый код с новым после вашего ценного совета ... теперь это так ... но все еще не работает.

Обновление:изменив foreach следующим образом:

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

решил проблему ... но возникает другой: теперь каждый раз, когда он заменяет строку, он добавляет слово «Array» перед ней.

Ответы [ 5 ]

4 голосов
/ 05 ноября 2010

Каждый раз вы передаете весь массив $ 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);
4 голосов
/ 05 ноября 2010

Да, проблема в вашем втором foreach. Это должно читаться так:

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

Вы забыли ключ, поэтому он заменяет каждый экземпляр каждого значения в $ glossArray на значение $. Удачи с этим!

3 голосов
/ 05 ноября 2010

Почему вы открываете 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 голос
/ 05 ноября 2010

Ваш первый параметр для 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 $ файл, когда вы закончите.

Кстати: что $counter делает?

0 голосов
/ 08 ноября 2010

Решение вашей новой проблемы (которая должна быть на самом деле собственным вопросом, , а не редактирование существующей) состоит в том, что 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 извлекаются, и каждое значение объединяется с вашей строкой - если вы просто попытаетесь объединить строку с массивом, вы получите строку, а не массив.

...