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 關注
- 124 瀏覽
添加回答
舉報