PHP多数据源数组去重、合并及CSV导出求助:常规函数失效
多维数组去重+合并+CSV导出解决方案
嘿,我来帮你搞定这个问题!你之前试的array_unique()、array_diff()这些函数没用太正常了——它们要么只处理一维数组,要么是用来算差集的,完全不匹配你需要按指定字段去重合并的场景。结合你的需求,我给你梳理几个实用的实现方向:
1. 自定义去重+合并匹配值
因为你的数组是多维的(从示例看应该是每个元素包含编码、日期、数值这类字段),核心思路是用**你要匹配的字段(比如第一个值aaa-aaa这种编码)**作为临时数组的键,遍历过程中合并重复项的值:
示例代码(模拟你的映射后数组结构):
$originalData = [ ['code' => 'aaa-aaa', 'date' => '12/1/1', 'value' => 1.15], ['code' => 'aaa-aaa', 'date' => '12/1/1', 'value' => 0.75], // 和上一条编码+日期重复 ['code' => 'bbb-bbb', 'date' => '10/1/1', 'value' => 0.15], ['code' => 'bbb-bbb', 'date' => '10/1/1', 'value' => 0.25], ]; $mergedResult = []; foreach ($originalData as $item) { // 用「编码+日期」组合成唯一键,确保精准匹配重复项 $uniqueKey = $item['code'] . '|' . $item['date']; if (isset($mergedResult[$uniqueKey])) { // 这里是合并逻辑,我用了求和,你可以改成取最大值/最小值/拼接字符串 $mergedResult[$uniqueKey]['value'] += $item['value']; } else { $mergedResult[$uniqueKey] = $item; } } // 把关联数组转成普通索引数组 $finalArray = array_values($mergedResult); print_r($finalArray);
运行后会得到合并后的数组,比如aaa-aaa的数值会变成1.9,完美合并重复项。
2. 筛选索引生成新数组
如果不需要合并值,只是想保留每个重复组的第一条(或者指定条件的条目),可以用这个简化版:
$filteredArray = []; $seenKeys = []; foreach ($originalData as $index => $item) { $uniqueKey = $item['code'] . '|' . $item['date']; if (!in_array($uniqueKey, $seenKeys)) { $seenKeys[] = $uniqueKey; $filteredArray[] = $item; // 保留当前条目,也可以改成保留原索引:$filteredArray[$index] = $item; } } print_r($filteredArray);
这样会得到每个唯一组的第一条数据,不会有重复项。
3. 导出指定索引内容为CSV
不管是去重后的数组还是原数组,PHP自带的fputcsv()就能轻松导出,不用额外工具:
示例代码(直接在浏览器下载CSV):
// 定义CSV表头 $csvHeaders = ['编码', '日期', '数值']; // 用上面去重后的数组作为数据源 $dataToExport = $finalArray; // 打开输出流,准备输出CSV $fp = fopen('php://output', 'w'); // 写入表头 fputcsv($fp, $csvHeaders); // 逐行写入数据 foreach ($dataToExport as $row) { // 只导出你需要的字段,对应数组的索引/键 fputcsv($fp, [$row['code'], $row['date'], $row['value']]); } fclose($fp); // 加上响应头,让浏览器识别为下载文件 header('Content-Type: text/csv'); header('Content-Disposition: attachment; filename="merged_data.csv"');
如果想写入服务器本地文件,把php://output改成文件路径(比如./export.csv)就行。
为啥之前的函数没用?
array_unique():默认只处理一维数组,就算加SORT_REGULAR参数,也是对比整个数组的所有值,而你只需要匹配部分字段,所以不适用array_diff()/array_diff_key():这些是用来计算两个数组的差集,不是按指定字段去重合并,完全不对症
内容的提问来源于stack exchange,提问作者mezzomix
相关产品推荐
相关产品推荐

