我有以下在 PHP 7 中工作的 WordPress 函数。自从转换到 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";
}
在我的错误日志中,我看到与 $lines = str_replace 行相关的“PHP 警告:数组到字符串转换”,但我认为 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 中,它会尝试将每个内部数组转换为字符串,发出警告并生成单词“Array”(然后将对其应用任何替换)。
两个 PHP 版本
的修复方法是在每个内部数组上运行 str_replace
,最简单的是使用
array_map
:var_dump(
array_map(
fn($innerArray) => str_replace('item', 'ITEM', $innerArray),
$lines
)
);
或者,您可以完全删除
str_replace
行,因为当它实际上没有做任何事情时,您显然很高兴。