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

PHP处理上传CSV文件时出现Illegal string offset警告如何修复

PHP关联分析功能报错修复方案

报错根源

你的Illegal string offset报错来自count_support函数的逻辑错误:

  • 读取CSV得到的$arr是二维数组,$arr[$i]对应单条购买记录,$arr[$i][$j]已经是单个商品的字符串值,你试图用商品名(比如Tomato Red)作为字符串的下标访问,PHP不支持字符串使用非数字下标,因此抛出警告,大量警告最终导致页面崩溃。
  • 额外存在两个逻辑错误:
    1. 输出判断中$finalcount = 3是赋值操作,不是相等判断,会强制满足输出条件,导致无限输出
    2. 商品共现统计逻辑错误,不需要遍历到商品元素层级,直接判断单条记录是否同时包含两个商品即可

修复后的完整PHP代码

<?php
if($_SERVER['REQUEST_METHOD'] == 'POST'){
    // 读取CSV文件内容
    $csv = array();
    $file = fopen($_FILES['filename']['tmp_name'], "r");

    while (($result = fgetcsv($file)) !== false)
    {
        // 过滤单条记录里的空值,避免干扰统计
        $csv[] = array_filter($result, "myFilter");
    }

    fclose($file);
    
    // 生成去重的商品列表
    $onedarray = array_2d_to_1d($csv);
    $onedarraynoneempty = array_unique(array_filter($onedarray, "myFilter"));
    $arraynum = array_merge(removeNum($onedarraynoneempty));
    $counts = array_count_values($onedarray);
    
    // 遍历统计关联关系
    for ($i = 0; $i < count($arraynum)-1; $i++){
        $newlist = array_merge(removeActual($arraynum, $i));
        count_support($csv, $arraynum[$i], $counts[$arraynum[$i]], $newlist);
    }
    
}

// 统计两个商品的共现次数,输出符合条件的关联关系
function count_support($arr, $item, $totalcount, $newlist){
    for ($b = 0; $b < count($newlist); $b++){
        $finalcount = 0;
        $compare = $newlist[$b];
        // 遍历每条购买记录,判断是否同时包含两个商品
        foreach ($arr as $order) {
            if(in_array($item, $order) && in_array($compare, $order)){
                $finalcount ++;
            }
        }
        
        // 输出支持度为3的结果
        $confidence = number_format($finalcount / $totalcount, 2);
        if($finalcount == 3)
        {
            echo $item . " -> " . $compare . ", Support: 3, Confidence: " . $confidence . "<br/ >"; 
        }
    }
}

// 二维数组转一维数组
function array_2d_to_1d($input_array) {
    $output_array = array();
    
    for ($i = 0; $i < count($input_array); $i++) {
      for ($j = 0; $j < count($input_array[$i]); $j++) {
        $output_array[] = $input_array[$i][$j];
      }
    }

    return $output_array;
}
// 过滤空元素
function myFilter($var){
    return ($var !== NULL && $var !== FALSE && $var !== "");
}
// 移除数组中的数字元素
function removeNum($var){
    for ($i = 0; $i < count($var); $i++) {
        if (is_numeric($var[$i])) {
            unset($var[$i]);
        }
    }
    return $var;
}
// 移除数组指定位置元素
function removeActual($var, $listnum){
    unset($var[$listnum]);
    return $var;
}
?>

主要修改点

  • 重写了count_support函数的共现统计逻辑,用in_array判断单条订单是否同时包含两个商品,避免非法下标访问
  • 把错误的赋值操作$finalcount = 3修改为相等判断$finalcount == 3
  • 置信度计算改为动态使用实际共现次数$finalcount,不再写死3,避免数据错误
  • 读取CSV时直接过滤单条订单的空值,减少后续统计的干扰
  • 移除了count_support函数无用的入参

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 05:48:04