如何过滤数据,避免重复写入

当前使用的 laravel 框架,业务需求:读取上传的 Excel 数据
为了避免重复上传我检查了文件的 hash,
但是:如果文件内容被稍微更改,或其中包含早已写入数据库的值,就需要过滤这部分数据
我现在的做法是:双 foreach 根据各自结果集的部分条件判断来 unsert 原有数据,可以剔除重复的列;显而易见,如果两个结果列数各大于 100, 这个执行过程就要循环大于 10000 次,
??感觉很消耗资源,有没有更好的解决办法呢?? --- 请指教

foreach ($track as $k => $v) {
    foreach ($new_arr as $ak => $av) {
        if ($av['pur_id'] == $v->pur_id && $av['num'] == $v->num) {
            unset($new_arr[$ak]);
        }
    }
}
阅读 2.5k
2 个回答

如果你判断重复的数据依靠的是数据库的主键(也就是唯一标识)的话,可以考虑直接在插入数据库的时候,使用replace into或者insert ignore来处理重复的数据。前者执行替换,后者执行忽略。判断条件都是主键(联合主键/唯一索引)。

先用一个foreach做一个 pur_id => num 的映射关系,然后通过foreach判断内容是否已存在于map内,存在则unset,这样虽然分了两次,但实际可以当作一次循环,第一个foreach可以使用array_column来代替

$map = [];
foreach ($track as $k => $v) {
    $map[$v->pur_id] = $v->num;
}
unset($track);
foreach ($new_arr as $ak => $av) {
    if (isset($map[$av['pur_id']]) && $av['num'] == $map[$av['pur_id']]) unset($new_arr[$ak]);
}
$map = array_column($track,'num','pur_id');
unset($track);
foreach ($new_arr as $ak => $av) {
    if (isset($map[$av['pur_id']]) && $av['num'] == $map[$av['pur_id']]) unset($new_arr[$ak]);
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题