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