2 回答
TA贡献1111条经验 获得超0个赞
您可以按 索引每个数组,然后计算键中的差值: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);
若要比较整个数组内容(如果只添加多个和),则可以映射每个数组并序列化为字符串表示形式并进行比较。请注意,元素的顺序也很重要:idanother_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)));
在演示站点上,这个适用于40,000个数组项目,但不是50,000个。这将取决于您的资源和设置。php.ini
还有一个array_intersect_key,如果你想看到每个数组中有什么相同,array_intersect。
TA贡献1802条经验 获得超4个赞
你正在做很多循环。,并使用大量时间。foreacharray_filterarray_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 关注
- 128 浏览
添加回答
举报