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