You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP比对CSV文件内字符串时strcmp函数报错问题如何解决

错误原因
  • 你使用的CSV文件第一行是表头,且部分行不存在第二列(索引为1的字段),直接访问$data1[1]/$data2[1]会触发数组索引不存在的警告,拿到的空值传入strcmp()函数就会触发参数类型错误。
  • 现有逻辑效率极低:遍历CSV1每一行时都重复打开读取一遍CSV2,文件行数较多时会出现严重的性能问题甚至超时。
  • 原后缀判断逻辑有隐患:如果文件名包含多个.(比如test.2024.csv),用explode('.', $name)[1]取到的不是真实的文件后缀。
修复后的upload.php代码
<?php
// 存储CSV2中第二列的所有值,用于快速比对
$csv2Values = [];

if($_FILES['csv1']['error'] == 0 && $_FILES['csv2']['error'] == 0){
    // 修复后缀判断逻辑
    $ext1 = strtolower(pathinfo($_FILES['csv1']['name'], PATHINFO_EXTENSION));
    $ext2 = strtolower(pathinfo($_FILES['csv2']['name'], PATHINFO_EXTENSION));
    $tmpName1 = $_FILES['csv1']['tmp_name'];
    $tmpName2 = $_FILES['csv2']['tmp_name'];

    if($ext1 == 'csv' && $ext2 == 'csv'){
        set_time_limit(0);
        // 先一次性读取CSV2的所有第二列值存入数组,跳过表头
        if(($handle2 = fopen($tmpName2, 'r')) !== FALSE) {
            $row2 = 0;
            while(($data2 = fgetcsv($handle2, 1024, ',')) !== FALSE) {
                $row2++;
                // 跳过表头行,且确保第二列存在
                if($row2 == 1 || !isset($data2[1])) continue;
                $csv2Values[] = trim($data2[1]);
            }
            fclose($handle2);
        }

        // 遍历CSV1比对
        if(($handle1 = fopen($tmpName1, 'r')) !== FALSE) {
            $row1 = 0;
            while(($data1 = fgetcsv($handle1, 1024, ',')) !== FALSE) {
                $row1++;
                // 跳过表头+判断第二列是否存在
                if($row1 == 1 || !isset($data1[1])) continue;
                $dna1 = trim($data1[1]);
                // 直接用in_array比对,比嵌套循环效率高很多
                if(in_array($dna1, $csv2Values)){
                    printf("<p> %s </p>", htmlspecialchars($dna1));
                }
            }
            fclose($handle1);
        }
    }
}
?>
修复说明
  • 新增isset($data[1])判断,确保第二列存在才读取,避免数组索引不存在的错误
  • 先一次性读取CSV2的目标列存入数组,仅读取1次CSV2,比对用in_array完成,性能提升非常明显
  • 用pathinfo取文件后缀,兼容带多个.的文件名
  • 新增表头行跳过逻辑,避免把表头字段纳入比对
  • 新增trim()清除字段前后的空格、换行等隐形字符,避免因为隐形字符导致比对失败
  • 输出的时候加htmlspecialchars避免XSS风险

内容的提问来源于stack exchange,提问作者Rodrigo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 00:39:04