转换为 PHP 8.1 后出现 CSV 导入问题

问题描述 投票:0回答:1

我有以下在 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 文件的内容。 请问有什么想法吗?

php csv fopen php-8.1
1个回答
1
投票

你的代码总是被破坏,只是以比以前更明显的方式被破坏了......

$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

行,因为当它实际上没有做任何事情时,您显然很高兴。

    

© www.soinside.com 2019 - 2024. All rights reserved.