У меня есть следующая функция Wordpress, которая работала в PHP 7. После преобразования в 8.1 она не работает.
function dropdown_handler() {
$output = drop_function();
//send back text to replace shortcode in post
return $output;
}
function drop_function() {
//get the csv file with amounts
if ($file_handle = fopen("wp-content/plugins/drop/amounts.csv", "r")) {
while (!feof($file_handle) ) {
$lines[] = fgetcsv($file_handle, 1024);
}
fclose($file_handle);
$lines = str_replace ("£","£",$lines);
}
else {
echo "Sorry, something went wrong";
}
В моем журнале ошибок я вижу «Предупреждение PHP: преобразование массива в строку в», относящееся к строке $lines = str_replace, но я думаю, что что-то не так с оператором fopen.
По сути, слово Array хранится в переменной $lines
, а не в содержимом CSV-файла.
Любые идеи, пожалуйста?
Ваш код всегда был сломан, просто он сломан немного более очевидным образом, чем раньше...
$lines[] = fgetcsv($file_handle, 1024);
fgetcsv
, если не происходит сбой, возвращает массив; затем вы добавляете этот массив как новый элемент в другой массив, $lines
. Результатом является массив массивов, например:
$lines = [
['line 1 first item', 'line 1 second item'],
['line 2 first item', 'line 2 second item'],
];
Позже вы передаете весь этот массив в str_replace
; но str_replace
знает, как работать только с одним измерением массива.
Итак, это работает:
$singleLine = ['line 1 first item', 'line 1 second item'];
var_dump(str_replace('item', 'ITEM', $singleLine));
Но это не так:
var_dump(str_replace('item', 'ITEM', $lines));
Выполнение этого примера на нескольких версиях PHP показывает, что в PHP 7.x str_replace
реагировал, просто оставляя внутренние массивы нетронутыми — другими словами, он ничего не делал.
В PHP 8 вместо этого он пытается превратить каждый внутренний массив в строку, выдавая предупреждение и создавая слово «Массив» (к которому затем будут применены любые замены).
Исправление для обеих версий PHP заключается в запуске str_replace
для каждого из внутренних массивов, проще всего с помощью array_map
:
var_dump(
array_map(
fn($innerArray) => str_replace('item', 'ITEM', $innerArray),
$lines
)
);
В качестве альтернативы вы можете просто полностью удалить строку str_replace
, поскольку вы, по-видимому, были достаточно счастливы, когда на самом деле она ничего не делала.