我有以下在PHP7中工作的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";
}
在我的错误日志中;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
;而CCD_ 5只知道如何处理数组的一维。
所以这是有效的:
$singleLine = ['line 1 first item', 'line 1 second item'];
var_dump(str_replace('item', 'ITEM', $singleLine));
但事实并非如此:
var_dump(str_replace('item', 'ITEM', $lines));
在多个版本的PHP上运行该示例表明,在PHP7.x下,str_replace
的反应只是简单地保持内部数组不变——换句话说,它什么也没做。
在PHP8中,它尝试将每个内部数组变成一个字符串,发出警告并生成单词";数组";(然后将对其应用任何替换(。
两个PHP版本的修复程序是在每个内部数组上运行str_replace
,最简单的方法是使用array_map
:
var_dump(
array_map(
fn($innerArray) => str_replace('item', 'ITEM', $innerArray),
$lines
)
);
或者,您可以完全删除str_replace
行,因为当它实际上什么都没做时,您显然已经足够高兴了。