2 回答
TA贡献1859条经验 获得超6个赞
您可以通过索引每个数组,id然后计算键的差异:
// Get items that are in CSV but not in database
$new = array_diff_key(array_column($csv, null, 'id'), array_column($db, null, 'id'));
// Get items that are in database but not in CSV
$del = array_diff_key(array_column($db, null, 'id'), array_column($csv, null, 'id'));
这是一个使用两个简单数组的演示,每个数组包含 50,000 个项目。
这很简短,但您可能不想array_column多次运行:
$csv = array_column($csv, null, 'id');
$db = array_column($db, null, 'id');
// Get items that are in CSV but not in database
$new = array_diff_key($csv, $db);
// Get items that are in database but not in CSV
$del = array_diff_key($db, $csv);
要比较整个数组内容(如果您添加的不仅仅是idand ,这将起作用another_id),您可以将每个数组映射并序列化为字符串表示形式并进行比较。请注意,元素的顺序也很重要:
// Get items that are in CSV but not in database
$new = array_map('unserialize',
array_diff(array_map('serialize', $csv), array_map('serialize', $db)));
// Get items that are in database but not in CSV
$del = array_map('unserialize',
array_diff(array_map('serialize', $db), array_map('serialize', $csv)));
在 DEMO 站点上,这个适用于 40,000 个数组项,但不是 50,000 个。这将取决于您的资源和php.ini设置。
如果您想查看每个数组中的相同内容,还有一个array_intersect_key和array_intersect 。
TA贡献1752条经验 获得超4个赞
你正在做很多循环。foreach,array_filter并array_map使用大量时间。
$new_to_database = array_udiff($secondArr, $firstArr, function ($s, $f) {
if ($s['id'] == $f['id'] && $s['another_id'] == $f['another_id']) {
return 0;
} else {
return -1;
}
});
这以更少的迭代提供了您需要的结果。
- 2 回答
- 0 关注
- 96 浏览
添加回答
举报