PHP, проблема с заменой str при чтении из массива


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

Любая помощь будет признательна

Заранее благодарю вас

Надер

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

Update: изменение foreach с помощью:

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

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

5 3

5 ответов:

Вы каждый раз передаете весь $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);

Да, проблема в вашем втором предисловии. Она должна звучать так:

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

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

Почему вы открываете файл 2.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 один раз.

Ваш первый параметр для 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?

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