PHP处理上传CSV文件时出现Illegal string offset警告如何修复
PHP关联分析功能报错修复方案
报错根源
你的Illegal string offset报错来自count_support函数的逻辑错误:
- 读取CSV得到的
$arr是二维数组,$arr[$i]对应单条购买记录,$arr[$i][$j]已经是单个商品的字符串值,你试图用商品名(比如Tomato Red)作为字符串的下标访问,PHP不支持字符串使用非数字下标,因此抛出警告,大量警告最终导致页面崩溃。 - 额外存在两个逻辑错误:
- 输出判断中
$finalcount = 3是赋值操作,不是相等判断,会强制满足输出条件,导致无限输出 - 商品共现统计逻辑错误,不需要遍历到商品元素层级,直接判断单条记录是否同时包含两个商品即可
- 输出判断中
修复后的完整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
相关产品推荐
相关产品推荐

